1

我是一名学生,我只是在尝试一些基本的 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

4 回答 4

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。您还应该检查一个未签名,另一个未签名。它们都需要完全相同。
  2. 您尝试引用的关键字段之一没有索引和/或不是主键。如果关系中的某个字段不是主键,则必须为该字段创建索引。
  3. 外键名称是已经存在的键的副本。检查您的外键名称在您的数据库中是唯一的。只需在密钥名称的末尾添加一些随机字符即可进行测试。
  4. 您的一个或两个表是 MyISAM 表。为了使用外键,表必须都是 InnoDB。(实际上,如果两个表都是 MyISAM,那么您将不会收到错误消息 - 它只是不会创建密钥。)在查询浏览器中,您可以指定表类型。
  5. 您已指定级联 ON DELETE SET NULL,但相关的关键字段设置为 NOT NULL。您可以通过更改级联或将字段设置为允许 NULL 值来解决此问题。

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

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

  8. 关系中的一个字段是组合(复合)键的一部分,并且没有自己的单独索引。即使该字段有一个索引作为复合键的一部分,您也必须仅为该键字段创建一个单独的索引才能在约束中使用它。

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

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

有关详细信息,请参阅: MySQL 错误号 1005 无法创建表

于 2012-10-25T06:43:31.977 回答
1

这:

FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)

只有当你有

  1. 该客户(P_ID)字段的索引,因此您应该添加一个
  2. 使用 innodb -> 如果这不是您的默认引擎,您应该专门添加该引擎。

添加索引如下所示:

    INDEX(P_ID)

我无法为您尝试,所以这里只是“干”编码,但我很确定就是这样。显然要注意放置之类的事情,,但这应该可行。

于 2012-10-25T06:46:15.647 回答
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 声明为外键之前,必须将其声明为主键。

于 2012-10-25T06:48:25.040 回答
0

这应该有效,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`)
);
于 2012-10-25T06:50:21.673 回答