mysql赢得';不允许使用外键
很多人已经有了这个问题,但在其他岗位上没有合适的解决方案 我有两个表,一个名为“sales”,另一个名为“host_flags”。我想为host_flags.sales_id到sales.id提供一个外键,但mysql不允许!我在每个表中都定义了主索引,所以我想知道为什么 host_flags表在列host_id上已经有一个外键,但即使我尝试先为sales id创建外键,它也不允许我这样做 这些表如下所示:mysql赢得';不允许使用外键,mysql,foreign-keys,Mysql,Foreign Keys,很多人已经有了这个问题,但在其他岗位上没有合适的解决方案 我有两个表,一个名为“sales”,另一个名为“host_flags”。我想为host_flags.sales_id到sales.id提供一个外键,但mysql不允许!我在每个表中都定义了主索引,所以我想知道为什么 host_flags表在列host_id上已经有一个外键,但即使我尝试先为sales id创建外键,它也不允许我这样做 这些表如下所示: CREATE TABLE `sales` ( `id` int(11) unsign
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)
谢谢
查尔斯
解决方案
主索引的所有整数都必须是有符号的或无符号的-不能混合。与Recursed的答案相补充: 要求外键contstraint的名称在数据库范围内必须是唯一的。也许换个名字行吗 对于某些特定情况,问题还包含几种解决方案。可能存在两个错误:
int(11)unsigned
主机
ALTER TABLE `tbl`
ADD CONSTRAINT `constr`
FOREIGN KEY `fk_id` REFERENCES `ftbl`(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE;
通过这种方式,我可以确保问题不是像tbl
fk_id
的数据类型与ftbl
id
的数据类型不同(包括@Devart所说的未签名的)。或者未将ftbl
id
声明为唯一。不管表的声明顺序如何
完成此操作后,我可以将约束重新集成到表定义中,并考虑创建表以允许添加约束所需的顺序
你的问题是:
“MySQL不允许你”…有错误消息吗?你说的“MySQL不允许我”到底是什么意思?确切的错误可能会有帮助。当然,对不起-请参见问题编辑。您可以将这3个表的整个DDL都放进去吗?@MihaiStancu是的,请参见问题编辑谢谢!我试过了,但它仍然说无法创建表'primarydata.#sql-191_1'(errno:150)
:-(请发布所有3个表的整个DDL,以便我们能够识别问题。您需要在host\u标志
表之前声明hosts
表和sales
表。您应该将约束从表定义中移除,并按照我的示例编写。在创建所有表之后。当然还有upd。)在问题文本中输入这个,这样我们就可以准确地看到您当前正在尝试的内容。这就是我从一开始就一直在尝试的内容-表hosts和sales已经存在,只有在添加表hosts_标志时,它才能正常工作…它与无法引用的表sales一起。引用的列都是int(11)和主。如果存在差异,请更改列定义。
-- 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