2013-12-12 60 views
0

當我運行此操作時,出現錯誤:無法添加外鍵約束 任何人都可以幫助我嗎?謝謝錯誤:無法在CREATE TABLE上添加外鍵約束

CREATE SCHEMA `Rubik's_Cubes`; 
USE `Rubik's_Cubes`; 

/*Tabella Collezionista*/ 
CREATE TABLE Collezionista(
    id INTEGER auto_increment PRIMARY KEY, 
    nome TEXT NOT NULL, 
    cognome TEXT NOT NULL, 
    telefono INTEGER NOT NULL, 
    ranking INTEGER NOT NULL UNIQUE, 
    id_ogg_pref INTEGER DEFAULT NULL, 

    FOREIGN KEY (id_ogg_pref) REFERENCES Oggetto(id) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
); 

/*Tabella Possiede*/ 
CREATE TABLE Possiede(
    id_collezionatore INTEGER NOT NULL, 
    id_oggetto INTEGER NOT NULL, 
    tempo_sol DOUBLE DEFAULT NULL, 

    FOREIGN KEY (id_collezionatore) REFERENCES Collezionista(id) 
     ON DELETE CASCADE 
     ON UPDATE NO ACTION, 

    FOREIGN KEY (id_oggetto) REFERENCES Oggetto(id) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION 
); 

/*Tabella Oggetto*/ 
CREATE TABLE Oggetto(
    id INTEGER AUTO_INCREMENT PRIMARY KEY, 
    nome TEXT NOT NULL, 
    id_tipo INTEGER NOT NULL, 
    id_tipo2 INTEGER DEFAULT NULL, 
    valore DOUBLE NOT NULL, 
    descrizione TEXT NOT NULL, 
    detentore_record INTEGER DEFAULT NULL, 
    tempo_record DOUBLE DEFAULT NULL, 

    FOREIGN KEY (id_tipo) REFERENCES Tipologia(id) 
     ON DELETE NO ACTION 
     ON UPDATE CASCADE, 

    FOREIGN KEY (id_tipo2) REFERENCES Tipologia(id) 
     ON DELETE NO ACTION 
     ON UPDATE CASCADE, 

    FOREIGN KEY (detentore_record) REFERENCES Collezionista(id) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
); 

/*Tabella Tipologia*/ 
CREATE TABLE Tipologia(
    id INTEGER AUTO_INCREMENT PRIMARY KEY, 
    nome TEXT NOT NULL, 
    descrizione TEXT NOT NULL, 
    provenienza TEXT NOT NULL 
); 

回答

0

執行Create語句的順序不正確。 您嘗試添加與尚不存在的表相關的約束。

例子: 您正在試圖創建Collezionista表和外鍵contraint添加到表Oggetto,甚至創建表Oggetto之前。 因此,您需要先創建參考表或父表,然後創建子表。

另外,表OggettoCollezionista是相互依賴。您需要從Oggetto中刪除FOREIGN KEY並最終添加爲alter。

普萊斯按照下面執行的序列:'

CREATE TABLE Tipologia(
id INTEGER AUTO_INCREMENT PRIMARY KEY, 
nome TEXT NOT NULL, 
descrizione TEXT NOT NULL, 
provenienza TEXT NOT NULL 
); 

CREATE TABLE Oggetto(
id INTEGER AUTO_INCREMENT PRIMARY KEY, 
nome TEXT NOT NULL, 
id_tipo INTEGER NOT NULL, 
id_tipo2 INTEGER DEFAULT NULL, 
valore DOUBLE NOT NULL, 
descrizione TEXT NOT NULL, 
detentore_record INTEGER DEFAULT NULL, 
tempo_record DOUBLE DEFAULT NULL, 
FOREIGN KEY (id_tipo) REFERENCES Tipologia(id) 
    ON DELETE NO ACTION 
    ON UPDATE CASCADE, 
FOREIGN KEY (id_tipo2) REFERENCES Tipologia(id) 
    ON DELETE NO ACTION 
    ON UPDATE CASCADE, 
); 


CREATE TABLE Collezionista(
ID整數AUTO_INCREMENT PRIMARY KEY,
諾姆TEXT NOT NULL,
cognome TEXT NOT NULL,
telefono INTEGER NOT NULL,
ranking INTEGER NOT NULL UNIQUE,
id_ogg_pref INTEGER DEFAULT NULL,
外鍵(id_ogg_pref)參考Oggetto(ID)
ON DELETE SET NULL
ON UPDATE CASCADE
);


CREATE TABLE Possiede(
id_collezionatore INTEGER NOT NULL,
id_oggetto INTEGER NOT NULL,
tempo_sol DOUBLE DEFAULT NULL,
外鍵(id_collezionatore)參考文獻Collezionista(ID)
ON DELETE CASCADE
ON UPDATE NO ACTION,
FOREIGN KEY(id_oggetto)REFERENCES Oggetto(id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);


ALTER TABLE Oggetto
添加外鍵(detentore_record)參考文獻Collezionista(ID)
ON DELETE SET NULL
ON UPDATE CASCADE

希望它可以幫助你。

謝謝,
Abhijit Das

1

您嘗試添加與尚不存在的表相關的約束。

你應該在你創建表的語句刪除此:

FOREIGN KEY (id_ogg_pref) REFERENCES Oggetto(id) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 

然後在與alter table末添加。請參閱第1個表的示例:

/*Tabella Collezionista*/ 
ALTER TABLE Collezionista 
    ADD FOREIGN KEY (id_ogg_pref) REFERENCES Oggetto(id) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE;