首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使表和引擎的数据类型相同,也不能创建外键?

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

Stack Overflow用户
提问于 2013-10-23 16:33:20
回答 2查看 54关注 0票数 0

我有下面的mysql表结构

这是第一表的结构:

代码语言:javascript
复制
   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 ;

这是第二表的结构:

代码语言:javascript
复制
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 (errno: 150)

代码语言:javascript
复制
ALTER TABLE adv_analytics ADD FOREIGN KEY fk_advertise_id (publish_advertiser_id) REFERENCES adv_publish(advertise_id) ON UPDATE CASCADE ON DELETE CASCADE;

两个表当前都是空的。请找出我代码中的矛盾之处。有点急事。谢谢你的支持。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-23 16:40:30

如在 Constraints下所记录的

MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。

因此,必须首先在adv_publish.advertise_id上创建索引。

代码语言:javascript
复制
ALTER TABLE adv_publish ADD INDEX (advertise_id)
票数 2
EN

Stack Overflow用户

发布于 2013-10-23 16:40:48

这是因为它必须引用一个主键(或唯一索引),而您编写的脚本引用的是advertise_id而不是id,后者是主键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19547340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档