首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个外键会失败?

问为什么这个外键会失败?
EN

Stack Overflow用户
提问于 2015-07-06 21:34:15
回答 2查看 188关注 0票数 0
代码语言:javascript
复制
CREATE TABLE `fitness_pledges` (
    `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `first_name` VARCHAR(250) NOT NULL,
    `last_name` VARCHAR(250) NOT NULL,
    `email` VARCHAR(100) NOT NULL,
    `token` BIGINT(20) UNSIGNED NOT NULL,
    `email_valid` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
    `entered_sweeps` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
    `referrals` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    PRIMARY KEY (`ID`),
    UNIQUE INDEX `email` (`email`),
    UNIQUE INDEX `token` (`token`)
)
COMMENT='holds validation token, first name, last name, email address, number of referrals and whether sweepstakes was entered\r\n'
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;

CREATE TABLE `finess_referrals` (
    `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `first_name` VARCHAR(250) NOT NULL,
    `last_name` VARCHAR(250) NOT NULL,
    `email` VARCHAR(100) NOT NULL,
    `token` BIGINT(20) UNSIGNED NOT NULL,
    `referral_token` BIGINT(20) UNSIGNED NOT NULL,
    `referral_validated` TINYINT(4) NOT NULL DEFAULT '0',
    PRIMARY KEY (`ID`),
    INDEX `token_FK` (`token`),
    INDEX `referral_token_FK` (`referral_token`),
    CONSTRAINT `referral_token_FK` FOREIGN KEY (`referral_token`) REFERENCES `fitness_pledges` (`token`) ON DELETE NO ACTION,
    CONSTRAINT `token_FK` FOREIGN KEY (`token`) REFERENCES `fitness_pledges` (`token`) ON DELETE NO ACTION
)
COMMENT='holds the first name, last name, email and validation token of the referrer as well as the token of the referred individual and a flag for whether the referred individual\'s email has been validated'
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;

这个由HeidiSQL生成的、试图为合并的first_name、last_name和email字段添加外键的Alter在外键约束下失败是错误的。字段都是相同定义的,排序规则是一样的。为什么失败了?

代码语言:javascript
复制
ALTER TABLE `finess_referrals`
ADD CONSTRAINT `first_last_email_FK` FOREIGN KEY (`first_name`, `last_name`, `email`) 
REFERENCES `fitness_pledges` (`first_name`, `last_name`, `email`) ON DELETE NO ACTION;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-06 22:02:32

您首先需要在fitness_pledges表中为(first_name, last_name, email)建立索引。来自使用外键约束

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

如果有必要,它将自动在引用表中创建索引,但对于引用的表,它不会这样做。

所以你需要做:

代码语言:javascript
复制
CREATE INDEX first_last_email ON fitness_pledges (first_name, last_name, email);
票数 1
EN

Stack Overflow用户

发布于 2015-07-06 22:04:01

根据SQL标准,外键必须引用父表的主键或唯一键。如果主键有多个列,则外键必须具有相同的列数和顺序。

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

https://stackoverflow.com/questions/31256037

复制
相关文章

相似问题

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