2

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

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

谢谢!

查尔斯

找到解决方案

主索引的所有整数都必须是有符号或无符号的 - 不能混合。

4

3 回答 3

3

通常:

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

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

这样我可以确保问题不是像tbl. fk_id与 中的一个不一样ftblid(包括UNSIGNED@Devart所说的)。或者没有声明ftblid作为独一无二的。无论表的声明顺序如何。

在我这样做之后,我可以将约束重新集成到表定义中,并考虑需要创建表以允许添加约束的顺序。

你的问题:

-- 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
于 2012-07-24T14:40:59.103 回答
0

除了递归的答案:

要求外键约束的名称在数据库范围内必须是唯一的。也许改名字会起作用?

MySQL 社区论坛上也有一个关于该问题的大量帖子,其中包含针对某些特定情况的几种解决方案。

于 2012-07-24T14:35:16.100 回答
0

可能的两个错误:

  1. 引用和被引用的列必须具有相同的类型 -int(11) unsigned
  2. 未知的引用表hosts
于 2012-07-24T14:37:21.900 回答