2

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

然后我正在尝试创建第二个表“页面”:

$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

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

4

5 回答 5

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,而您的主键不是。确保您的外键与其父项的规范相匹配。

于 2013-10-10T23:16:13.360 回答
1

来自 MySQL Using FOREIGN KEY Constraints文档:

外键和引用键中的对应列必须具有相似的数据类型。整数类型的大小和符号必须相同。

在您的page表中, the category_idis SMALLINT UNSIGNED,但在categoryit's justSMALLINT中。它们必须完全相同。

于 2013-10-10T23:14:11.913 回答
1

用于外键的列必须具有匹配的规范。在这里,您有一个 category_id 列已签名,而另一个未签名。换一个。

于 2013-10-10T23:14:16.440 回答
1

你的问题是 category_id 中的 UNSIGNED。尝试删除它

于 2013-10-10T23:15:01.040 回答
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";
于 2013-10-10T23:14:32.823 回答