即使表和引擎的数据类型相同,也无法创建外键?

时间:2013-10-23 16:33:20

标签: mysql innodb

我有以下mysql表结构

这是第一张表格的结构:

   CREATE TABLE IF NOT EXISTS `adv_publish` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `advertise_id` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
      `createdat` datetime NOT NULL,
      `removedat` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

这是第二张表的结构:

CREATE TABLE IF NOT EXISTS `adv_analytics` (
  `id` int(11) NOT NULL,
  `publish_advertiser_id` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

这是两个表之间的外键关系。当我执行时,我收到此错误消息:

1005 - 无法创建表'酒店。#sql-b80_155'(错误号:150)

ALTER TABLE adv_analytics ADD FOREIGN KEY fk_advertise_id (publish_advertiser_id) REFERENCES adv_publish(advertise_id) ON UPDATE CASCADE ON DELETE CASCADE;

这两个表目前都是空的。请找出我的代码中的矛盾。这有点紧迫。感谢您的支持。

2 个答案:

答案 0 :(得分:2)

正如Using FOREIGN KEY Constraints所述:

  

MySQL需要外键和引用键的索引,这样外键检查可以很快,不需要表扫描。

因此,您必须首先创建一个超过adv_publish.advertise_id的索引:

ALTER TABLE adv_publish ADD INDEX (advertise_id)

答案 1 :(得分:1)

这是因为它必须引用PRIMARY KEY(或UNIQUE索引),并且您编写的脚本引用advertise_id而不是作为主键的id。