【问题标题】:Error: Cannot add foreign key constraint on CREATE TABLE错误:无法在 CREATE TABLE 上添加外键约束
【发布时间】:2013-12-12 16:52:50
【问题描述】:

当我运行它时,我收到错误:无法添加外键约束 谁能帮我?谢谢

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

【问题讨论】:

    标签: mysql sql key


    【解决方案1】:

    您尝试添加与尚不存在的表相关的约束。

    你应该在你的创建表语句中删除它:

    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;
    

    【讨论】:

      【解决方案2】:

      您执行 Create 语句的顺序不正确。 您尝试添加与尚不存在的表相关的约束。

      示例: 您正在尝试创建 Collezionista 表并将外键约束添加到表 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 INTEGER auto_increment PRIMARY KEY,
      名称文本不为空,
      认知文本不为空,
      电话 INTEGER NOT NULL,
      排名 INTEGER NOT NULL UNIQUE,
      id_ogg_pref 整数默认 NULL,
      外键 (id_ogg_pref) 参考 Oggetto(id)
      ON DELETE SET NULL
      更新级联
      );


      创建表 Possiede(
      id_collezionatore INTEGER NOT NULL,
      id_oggetto INTEGER NOT NULL,
      tempo_sol 双默认 NULL,
      外键 (id_collezionatore) 参考 Collezionista(id)
      删除级联
      更新无操作,
      外键 (id_oggetto) 参考 Oggetto(id)
      删除时无操作
      更新时无操作
      );


      ALTER TABLE Oggetto
      添加外键 (detentore_record) 参考 Collezionista(id)
      ON DELETE SET NULL
      更新级联

      希望对你有帮助。

      谢谢,
      阿比吉特·达斯

      【讨论】:

        猜你喜欢
        • 2015-11-14
        • 2018-04-05
        • 2020-09-14
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多