0
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 によって生成されたこの Alter Table は、結合された first_name、last_name、および email フィールドに外部キーを追加しようとして、Foreign key constraint is imerrized で失敗します。フィールドはすべて同じように定義されており、照合は同じです。なぜ失敗するのですか?

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;
4

2 に答える 2

1

fitness_pledges最初にテーブルにインデックスが必要です(first_name, last_name, email)FOREIGN KEY制約の使用から:

MySQL では、外部キーのチェックが高速になり、テーブル スキャンが不要になるように、外部キーと参照キーにインデックスが必要です。

必要に応じて、参照テーブルにインデックスを自動的に作成しますが、参照テーブルには作成しません。

したがって、次のことを行う必要があります。

CREATE INDEX first_last_email ON fitness_pledges (first_name, last_name, email);
于 2015-07-06T22:02:32.190 に答える