2013-07-01 61 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); 

所以,我想默認情況下將設置Acquisto(idDipendente,idProdotto,idFondo)-1價值,但是當我刪除Dipendente的一行idDipendente = 1在表Acquisto中,字段idDipendente設置爲1。我不知道是什麼問題。

+0

請刪除額外的代碼,並只留下相關的位。 – mishik

+0

完成!對不起。 –

回答

0

在表「Acquisto」中,您有三個外鍵引用。這些外鍵引用的每一列都有一個默認值-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

好的,但實際上我想查詢所有的Acquisto行,有或沒有idDipendente,帶或不帶idProdotto,帶或不帶idFondo。我也可以用一個空字段替換默認值,並在約束集ON DELETE SET NULL(我現在嘗試它,但仍然不起作用)。怎麼可以做到這一點? –

+0

@MatteoCalò:更新了答案。 –