mysql赢得';不允许使用外键

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

很多人已经有了这个问题,但在其他岗位上没有合适的解决方案

我有两个表,一个名为“sales”,另一个名为“host_flags”。我想为host_flags.sales_id到sales.id提供一个外键,但mysql不允许!我在每个表中都定义了主索引,所以我想知道为什么

host_flags表在列host_id上已经有一个外键,但即使我尝试先为sales 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)
谢谢

查尔斯

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

与Recursed的答案相补充:

要求外键contstraint的名称在数据库范围内必须是唯一的。也许换个名字行吗

对于某些特定情况,问题还包含几种解决方案。

可能存在两个错误:

  • 引用列和被引用列的类型必须相同-
    int(11)unsigned
  • 未知的引用表
    主机
  • 通常: 我喜欢在构造完所有表之后在表定义之外声明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
    的数据类型不同(包括@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