2013-07-01 6 views
0

문제가 있습니다. 내가있는 테이블을 만들려면 3 외국SQLite, 내 참조가 작동하지 않습니다.

PRAGMA foreign_keys = ON; 
CREATE TABLE "Dipendente" ("idDipendente" INTEGER PRIMARY KEY AUTOINCREMENT, 
               "nome" VARCHAR NOT NULL, 
               "cognome" VARCHAR NOT NULL , 
               "email" VARCHAR NOT NULL UNIQUE , 
               "password" VARCHAR NOT NULL , 
               "tipo" VARCHAR NOT NULL); 


CREATE TABLE "Prodotto" ("idProdotto" INTEGER PRIMARY KEY AUTOINCREMENT, 
              "nome" VARCHAR NOT NULL UNIQUE, 
              "qta" INTEGER NOT NULL, 
              "prezzoUnita" FLOAT NOT NULL); 

CREATE TABLE "Fondo" ("idFondo" INTEGER PRIMARY KEY AUTOINCREMENT, 
             "nome" VARCHAR NOT NULL UNIQUE, 
             "fondoDisponibile" FLOAT NOT NULL); 

CREATE TABLE IF NOT EXISTS "Acquisto" (
    `idAcquisto` INTEGER PRIMARY KEY NOT NULL , 
    `idDipendente` INTEGER NOT NULL DEFAULT -1, 
    `idProdotto` INTEGER NOT NULL DEFAULT -1, 
    `idFondo` INTEGER NOT NULL DEFAULT -1, 
    `qta` INTEGER NOT NULL , 
    `dataAcquisto` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP , 

    CONSTRAINT `fk_acquisto_dipendente` 
    FOREIGN KEY (`idDipendente`) 
     REFERENCES `Dipendente` (`idDipendente`) 
     ON DELETE SET DEFAULT 
     ON UPDATE NO ACTION, 
    CONSTRAINT `fk_acquisto_prodotto` 
    FOREIGN KEY (`idProdotto`) 
     REFERENCES `Prodotto` (`idProdotto`) 
     ON DELETE SET DEFAULT 
     ON UPDATE NO ACTION, 

    CONSTRAINT `fk_acquisto_fondo` 
FOREIGN KEY (`idFondo`) 
    REFERENCES `Fondo` (`idFondo`) 
    ON DELETE SET DEFAULT 
    ON UPDATE NO ACTION); 

CREATE INDEX 'fk_acquisto_dipendente' ON 'Acquisto' ('idDipendente' ASC); 
CREATE INDEX 'fk_acquisto_prodotto' ON 'Acquisto' ('idProdotto' ASC); 
CREATE INDEX 'fk_acquisto_fondo' ON 'Acquisto' ('idFondo' ASC); 

그래서, 내가가 기본으로하여 -1 값 Acquisto (idDipendente, idProdotto, idFondo)를 설정하고 싶지만, 키 난 = 1 idDipendente으로 Dipendente의 행을 삭제할 때 Acquisto 테이블의 idDipendente 필드는 아직 1로 설정되어 있습니다. 나는 그 문제가 뭔지 모른다.

+0

추가 코드를 제거하고 관련 비트 만 남겨주세요. – mishik

+0

완료! 죄송 해요. –

답변

0

"Acquisto"테이블에는 3 개의 외래 키 참조가 있습니다. 이들 외래 키 참조의 각 열은 기본값 -1을 가지며 참조 된 테이블에서 유효한 값이 아닌 것으로 간주됩니다.

"Dipendente"에 처음으로 행을 삽입하고 해당 행의 "idDipendente"가 -1 인 경우 "idDipendente"가 1 인 행을 삭제할 수 있습니다. 그렇게하면 Acquisto.idDependente에서 -1의 기본값을 찾습니다.

짧은 이야기는 당신의 외래 키 참조가 -1의 기본 값을 선언 에서 당신을 방지하지 않습니다, 그러나 그것은 않습니다을 사용 에서 당신을 방지 할 수 있습니다.

값을 NULL로 설정하려면이 줄을 따라 뭔가를 수행해야합니다.

pragma foreign_keys = on; 
create table a (id integer primary key); 
insert into a values (1); 
create table b (
    b_id integer primary key, 
    a_id integer references a(id) 
    on delete set null); 
insert into b values (1, 1); 
delete from a; 
select * from b; 

b_id  a_id  
---------- ---------- 
1      
+0

좋아,하지만 실제로 idquipo가 있거나없는 idProdotto 유무에 상관없이 IdPipentente 유무에 관계없이 Acquisto의 모든 행을 쿼리로 보여주고 싶습니다. 기본값을 null 필드로 바꾸고 제약 조건에서 ON DELETE SET NULL을 설정할 수도 있습니다 (지금 시도하지만 여전히 작동하지 않습니다). 어떻게 할 수 있니? –

+0

@ MatteoCalò : 업데이트 된 답변. –

관련 문제