mysql无法创建表 - 错误1005

时间:2012-10-25 06:41:05

标签: mysql sql create-table mysql-error-1005

我是学生,我只是尝试一些基本的mysql。但是,当涉及到以下代码时,我仍然遇到同样的错误。

  

错误代码:1005。无法创建表'mydatabase.orders'(错误号:150)

CREATE TABLE Customer
(
P_ID int(3) UNSIGNED NOT NULL,
LastName varchar(10) NOT NULL,
FirstName varchar(10) NOT NULL,
Address varchar(20) NOT NULL,
City varchar(10) NOT NULL
);


CREATE TABLE Orders
(
O_ID int(3) UNSIGNED NOT NULL,
OrderNo int NOT NULL,
P_ID int(3) UNSIGNED NOT NULL,
PRIMARY KEY (O_ID),
FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
);

4 个答案:

答案 0 :(得分:1)

错误代码:1005 - 代码中的主键引用错误

通常是由于参考FK字段不存在。可能是你有错字错误,或检查案例应该是相同的,或者是字段类型不匹配。 FK链接的字段必须与定义完全匹配。

第一步:

如果您在服务器上拥有管理员权限,则可能需要在收到错误后立即运行MySQL命令“SHOW INNODB STATUS”(或MySQL 5.5“SHOW ENGINE INNODB STATUS”)。此命令显示日志信息和错误详细信息。

如果您的脚本在一台服务器上运行良好,但在尝试在另一台服务器上运行时出错,则很可能#6是问题所在。不同版本的MySQL具有不同的默认字符集设置,您可能在不知不觉中在不同的服务器上分配了不同的字符集。

一些已知原因可能是:

  1. 两个关键字段类型和/或大小不完全匹配。对于   例如,如果一个是INT(10),则关键字段也需要是INT(10)   而不是INT(11)或TINYINT。您可能需要确认字段大小   使用SHOW CREATE TABLE,因为查询浏览器有时会在视觉上   INT(10)和INT(11)都显示INTEGER。你也应该检查一下   那个没有签名而另一个是UNSIGNED。他们都需要   完全一样。
  2. 您尝试引用的关键字段之一没有   索引和/或不是主键。如果其中一个字段   relationship不是主键,您必须为其创建索引   字段。
  3. 外键名称是已存在键的副本。   检查外键的名称在数据库中是否唯一。   只需在密钥名称的末尾添加一些随机字符即可进行测试   为此。
  4. 您的一个或两个表是MyISAM表。为了使用   外键,表必须都是InnoDB。 (实际上,如果两个表格   是MyISAM然后你不会收到错误消息 - 它只是不会创建   密钥。)在查询浏览器中,您可以指定表类型。
  5. 您已指定级联ON DELETE SET NULL,但相关   key字段设置为NOT NULL。你可以通过改变你的方式解决这个问题   级联或设置字段以允许NULL值。

  6. 确保Charset和Collat​​e选项在两者处都相同   表级别以及关键列的单个字段级别。

  7. 您的外键列上有默认值(即默认值= 0)

  8. 关系中的一个字段是组合的一部分   (复合)键,没有自己的个别索引。甚至   虽然该字段的索引是复合键的一部分,但您必须这样做   仅为该键字段创建单独的索引,以便在a中使用它   约束。

  9. 您的ALTER语句中有语法错误,或者您有   错误输入关系中的一个字段名称

    10外键的名称超过64个字符的最大长度。

  10. 有关详细信息,请参阅:MySQL Error Number 1005 Can’t create table

答案 1 :(得分:1)

此:

FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)

仅在您有

时才有效
  1. 该客户(P_ID)字段的索引,因此您应添加一个
  2. 使用innodb - >如果那不是您的默认引擎,则应该专门添加该引擎。
  3. 添加索引如下所示:

        INDEX(P_ID)
    

    我无法为你试试,所以这里只是“干”编码,但我很确定就是这样。明显地处理,位置之类的事情,但这应该有用。

答案 2 :(得分:1)

这应该有效,Customer表上没有PRIMARY KEY

编辑删除了ON DELETE CASCADE ON UPDATE CASCADE子句,可能不需要

CREATE TABLE Customer(
    P_ID int(3) UNSIGNED NOT NULL,
    LastName varchar(10) NOT NULL,
    FirstName varchar(10) NOT NULL,
    Address varchar(20) NOT NULL,
    City varchar(10) NOT NULL,
    PRIMARY KEY (`P_ID`)
);

CREATE TABLE Orders(
    O_ID int(3) UNSIGNED NOT NULL,
    OrderNo int(3) NOT NULL,
    P_ID int(3) UNSIGNED NOT NULL,
    PRIMARY KEY (O_ID),
    CONSTRAINT `P_ID` FOREIGN KEY(`P_ID`) REFERENCES `Customer` (`P_ID`)
);

答案 3 :(得分:0)

运行以下查询:

CREATE TABLE Customer
(
P_ID int(3) UNSIGNED NOT NULL,
LastName varchar(10) NOT NULL,
FirstName varchar(10) NOT NULL,
Address varchar(20) NOT NULL,
City varchar(10) NOT NULL,
PRIMARY KEY (P_ID)
);


CREATE TABLE Orders
(
O_ID int(3) UNSIGNED NOT NULL,
OrderNo int NOT NULL,
P_ID int(3) UNSIGNED NOT NULL,
PRIMARY KEY (O_ID),
FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
);

在将P_ID声明为外键之前,必须将其声明为主键。