2013-12-12 38 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;