很多人已经遇到过这个问题,但在其他帖子中没有合适的解决方案。
我有两个表,一个名为“sales”,另一个名为“host_flags”。我想有一个host_flags.sales_id的外键给sales.id,但mysql不会让我!我在每个表中定义了主索引,所以我想知道为什么......
host_flags表已经在主机host_id上有了一个外键,但即使我第一次尝试创建了销售ID的外键,它也不会让我。
表格如下:
CREATE TABLE `sales` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`creation` datetime DEFAULT NULL,
`lastupdate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
CREATE TABLE `host_flags` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`host_id` int(11) DEFAULT NULL,
`sales_id` int(11) DEFAULT NULL,
`creation` datetime DEFAULT NULL,
`lastupdate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `host_id6` (`host_id`),
CONSTRAINT `host_id6` FOREIGN KEY (`host_id`) REFERENCES `hosts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `hosts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`creation` datetime NOT NULL,
`lastupdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32225 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
我收到此错误消息:
MySQL said: Can't create table 'primarydata.#sql-191_1' (errno: 150)
谢谢!
查尔斯
主索引的所有内容必须是有符号或无符号的 - 不能混合。
答案 0 :(得分:3)
我喜欢在构造完所有表之后在表定义之外声明FK约束。
ALTER TABLE `tbl`
ADD CONSTRAINT `constr`
FOREIGN KEY `fk_id` REFERENCES `ftbl`(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE;
这样我可以确保问题不是tbl
的数据类型。fk_id
与ftbl
id
的数据类型不同。UNSIGNED
(包括ftbl
正如@Devart所说。或者没有声明id
。-- creating the sales table
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
-- creating the host_flags table
`sales_id` int(11) DEFAULT NULL,
-- the sales.id is declared as unsigned
-- the host_flags.sales_id is declared signed
是唯一的。无论表格的声明顺序如何。
执行此操作后,我可以将约束重新集成到表定义中,并考虑需要创建表的顺序以允许添加约束。
{{1}}
答案 1 :(得分:0)
Additonally to Recursed的回答:
要求外键约束'名称在数据库范围内必须是唯一的。也许更改名称会起作用吗?
此问题还有a huge thread on MySQL community forums,其中包含针对某些特定情况的多种解决方案。
答案 2 :(得分:0)
可能有两个错误:
int(11) unsigned
hosts
。