当我运行这个时,我得到错误:无法添加外键约束 谁能帮我?感谢
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 :(得分:1)
您尝试添加与尚不存在的表相关的约束。
您应该在create table语句中删除它:
FOREIGN KEY (id_ogg_pref) REFERENCES Oggetto(id)
ON DELETE SET NULL
ON UPDATE CASCADE
然后在最后添加alter table
。请参阅第一个表的示例:
/*Tabella Collezionista*/
ALTER TABLE Collezionista
ADD FOREIGN KEY (id_ogg_pref) REFERENCES Oggetto(id)
ON DELETE SET NULL
ON UPDATE CASCADE;
答案 1 :(得分:0)
执行Create语句的顺序不正确。 您尝试添加与尚不存在的表相关的约束。
实施例: 您正在尝试创建 Collezionista 表,并在创建表< Oggetto 之前添加外键约束<强> Oggetto 即可。 因此,您需要先创建引用表或父表,然后创建子表。
此外,表格 Oggetto 和 Collezionista 是相互依赖的。您需要从表 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 INTEGER auto_increment PRIMARY KEY,
nome TEXT NOT NULL,
cognome TEXT NOT NULL,
telefono INTEGER NOT NULL,
排名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
);
创造表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)
无法删除操作
更新无动作
);
ALTER TABLE Oggetto
添加外键(detentore_record)REFERENCES Collezionista(id)
ON DELETE SET NULL
ON UPDATE CASCADE
希望它对你有所帮助。
谢谢,
Abhijit Das