错误:无法在CREATE TABLE上添加外键约束

时间:2013-12-12 16:52:51

标签: mysql sql key

当我运行这个时,我得到错误:无法添加外键约束 谁能帮我?感谢

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
);

2 个答案:

答案 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