我是学生,我只是尝试一些基本的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)
);
答案 0 :(得分:1)
错误代码:1005 - 代码中的主键引用错误
通常是由于参考FK字段不存在。可能是你有错字错误,或检查案例应该是相同的,或者是字段类型不匹配。 FK链接的字段必须与定义完全匹配。
第一步:
如果您在服务器上拥有管理员权限,则可能需要在收到错误后立即运行MySQL命令“SHOW INNODB STATUS”(或MySQL 5.5“SHOW ENGINE INNODB STATUS”)。此命令显示日志信息和错误详细信息。
如果您的脚本在一台服务器上运行良好,但在尝试在另一台服务器上运行时出错,则很可能#6是问题所在。不同版本的MySQL具有不同的默认字符集设置,您可能在不知不觉中在不同的服务器上分配了不同的字符集。
一些已知原因可能是:
您已指定级联ON DELETE SET NULL,但相关 key字段设置为NOT NULL。你可以通过改变你的方式解决这个问题 级联或设置字段以允许NULL值。
确保Charset和Collate选项在两者处都相同 表级别以及关键列的单个字段级别。
您的外键列上有默认值(即默认值= 0)
关系中的一个字段是组合的一部分 (复合)键,没有自己的个别索引。甚至 虽然该字段的索引是复合键的一部分,但您必须这样做 仅为该键字段创建单独的索引,以便在a中使用它 约束。
您的ALTER语句中有语法错误,或者您有 错误输入关系中的一个字段名称
10外键的名称超过64个字符的最大长度。
有关详细信息,请参阅:MySQL Error Number 1005 Can’t create table
答案 1 :(得分:1)
此:
FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
仅在您有
时才有效添加索引如下所示:
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声明为外键之前,必须将其声明为主键。