我正在尝试编写一个PHP脚本来在同一个数据库中创建2个表,这些表应该通过1(表类别)链接到许多(表页面)关系。因此,'category'表中的主键'category_id'应该是表'page'中的外键。
表'类别'成功创建没有问题:
$sql="CREATE TABLE category(
category_id SMALLINT NOT NULL AUTO_INCREMENT,
category VARCHAR(30) NOT NULL,
PRIMARY KEY (category_id),
UNIQUE (category)
)ENGINE=InnoDB DEFAULT CHARSET=utf8";
然后我尝试创建第二个表'page':
$sql="CREATE TABLE page(
page_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
category_id SMALLINT UNSIGNED NOT NULL,
title VARCHAR(100) NOT NULL,
description TINYTEXT NOT NULL,
content LONGTEXT NOT NULL,
date_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (page_id),
FOREIGN KEY (category_id) REFERENCES category (category_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8";
我收到以下错误:
Error creating table: Cannot add foreign key constraint
你能告诉我我的代码有什么问题吗?非常感谢。
答案 0 :(得分:2)
根据http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html的MySql手册:
Corresponding columns in the foreign key and the referenced key must have similar data types.
The size and sign of integer types must be the same.
问题是您将外键指定为UNSIGNED
,而主要指定为{{1}}。确保您的外键符合其父项的规范。
答案 1 :(得分:1)
来自MySQL Using FOREIGN KEY Constraints文档:
外键和引用键中的对应列必须具有相似的数据类型。 整数类型的大小和符号必须相同。
在page
表中,category_id
为SMALLINT UNSIGNED
,但category
只有SMALLINT
。它们需要完全相同。
答案 2 :(得分:1)
用于外键的列必须具有匹配的规范。这里有一个category_id列已签名,而另一个是无符号列。换一个。
答案 3 :(得分:1)
你的问题是category_id中的UNSIGNED。 试着删除它
答案 4 :(得分:0)
试
$sql="CREATE TABLE page(
page_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
category_id SMALLINT NOT NULL,
title VARCHAR(100) NOT NULL,
description TINYTEXT NOT NULL,
content LONGTEXT NOT NULL,
date_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (page_id),
FOREIGN KEY (page.category_id) REFERENCES category (category.category_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8";