PHP MySQL创建表错误:无法添加外键约束

时间:2013-10-10 23:08:43

标签: php mysql sql

我正在尝试编写一个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

你能告诉我我的代码有什么问题吗?非常感谢。

5 个答案:

答案 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_idSMALLINT 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";