mysql不允许外键

时间:2012-07-24 14:24:51

标签: mysql foreign-keys

很多人已经遇到过这个问题,但在其他帖子中没有合适的解决方案。

我有两个表,一个名为“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)

谢谢!

查尔斯

找到解决方案

主索引的所有内容必须是有符号或无符号的 - 不能混合。

3 个答案:

答案 0 :(得分:3)

典型地:

我喜欢在构造完所有表之后在表定义之外声明FK约束。

ALTER TABLE `tbl`
    ADD CONSTRAINT `constr`
        FOREIGN KEY `fk_id` REFERENCES `ftbl`(`id`)
            ON UPDATE CASCADE
            ON DELETE CASCADE;

这样我可以确保问题不是tbl的数据类型。fk_idftbl 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)

可能有两个错误:

  1. 引用列和引用列必须具有相同的类型 - int(11) unsigned
  2. 未知的引用表hosts
相关问题