【问题标题】:Error code 1005, SQL state HY000: Can't create table errno: 150错误代码 1005,SQL 状态 HY000: Can't create table errno: 150
【发布时间】:2011-11-09 19:19:34
【问题描述】:

我正在尝试创建一个表,但只要我的 netbeans 错误地创建了 DB 的第一个表,脚本就会失败。

如何解决?

CREATE TABLE filmy
(
    Film_Id int NOT NULL,
    Nazwa varchar(250),
    Adres varchar(250),
    Data_Utworzenia date,
    Komentarz varchar(250),
    Gat_Id int,
    Sub_Id int,
    Aut_Id int,
    User_Id int,

    Primary Key (Film_Id),
    CONSTRAINT fk_GatFilmy FOREIGN KEY (Gat_Id) REFERENCES gatunek(Gat_Id),
    CONSTRAINT fk_SubFilmy FOREIGN KEY (Sub_Id) REFERENCES subgatunek(Sub_Id),
    CONSTRAINT fk_AutFilmy FOREIGN KEY (Aut_Id) REFERENCES autor(Aut_Id),
    CONSTRAINT fk_UserFilmy FOREIGN KEY (User_Id) REFERENCES users(User_Id)
)

【问题讨论】:

    标签: mysql database mysql-error-1005


    【解决方案1】:

    使用show innodb status - 隐藏在输出中(在中间附近)是“最后一个外键错误”部分。它将准确解释创建表失败的原因。

    通常是由于参考 FK 字段不存在(错字、错误的表),或者存在字段类型不匹配。 FK 链接字段必须与定义完全匹配。 char(1) 字段不能 FK'd 到 char(5) 字段等...

    注意:在 MySQL 5.5 中,此命令是 show engine innodb status(感谢 kewpiedoll99)

    【讨论】:

    • 谢谢!我发现问题是在 ,,main'' 表中的引用之后定义对表的引用。
    • 哇! show innodb status 对于调试来说是无价的。非常感谢!
    • show engine innodb status 如果前者不起作用,因为它不适合我;我正在使用 5.5.11 MySQL 社区服务器。
    【解决方案2】:

    这是我的解决方案:

    CREATE TABLE filmy 
    ( 
        Film_Id           int           NOT NULL, 
        Nazwa             varchar(250)      NULL, 
        Adres             varchar(250)      NULL, 
        Data_Utworzenia   date              DEFAULT '0000-00-00', 
        Komentarz         varchar(250)      NULL, 
        Gat_Id            int               NULL, 
        Sub_Id            int               NULL, 
        Aut_Id            int               NULL, 
        User_Id           int               NULL, 
     Primary Key (Film_Id, Gat_Id, Sub_Id, Aut_Id, User_Id )
    ) ENGINE=INNODB;
    

    外键约束是在创建gat, sub, aut & user后完成的,否则ide不知道这两个表是否存在,从而使表约束成为现实! 尝试:alter table filmy add constraint gatfilmy foreign key (gat_id) references gat(gat_id) on update restrict on delete restrict 你必须保持一致;将表命名为 gat 或 gatunek,不能同时命名。如果您不同时定义它们,cpu 将如何知道哪个是 gat 或 gatunek? 现在尝试使用其余约束并记住您必须先创建所有表才能更改它们!

    CONSTRAINT fk_GatFilmy FOREIGN KEY (Gat_Id) REFERENCES gatunek(Gat_Id), 
    CONSTRAINT fk_SubFilmy FOREIGN KEY (Sub_Id) REFERENCES subgatunek(Sub_Id), 
    CONSTRAINT fk_AutFilmy FOREIGN KEY (Aut_Id) REFERENCES autor(Aut_Id), 
    CONSTRAINT fk_UserFilmy FOREIGN KEY (User_Id) REFERENCES users(User_Id) 
    

    【讨论】:

    • 基本上是订单问题:)
    【解决方案3】:

    代码 150 是外键错误。

    其中一个引用的表或列不存在(可能稍后在您的脚本中)或与类型/长度/排序规则/字符集不匹配。依次将它们注释掉,看看是哪一个。

    或者在所有 CREATE 都运行后运行单独的 ALTER TABLE 命令

    【讨论】:

      【解决方案4】:

      当我尝试为没有索引的列添加外键时,通常会出现该错误;我注意到您的关联列在显示的 SQL 中都没有。

      【讨论】:

      • 最近的 mysql 版本现在将为您创建所需的索引,谢天谢地。
      【解决方案5】:

      您可能会在与其他表的关系中使用此表名(电影),然后您将其删除。检查任何关系并删除使用此表名的所有位置或更改表名,例如使用“filmy1” 我更改了我的表名,然后它起作用了。

      我希望这能奏效。

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 2020-03-23
        • 2021-08-31
        • 2021-04-24
        • 2018-10-04
        • 2016-07-27
        • 2017-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多