2015-07-06 4 views
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 
; 

Это Alter Table, порождена HeidiSQL, пытаясь добавить внешний ключ для комбинированных first_name, last_name и электронной почты полей терпит неудачу с иностранным ограничением ключа неправильно сформировано. Все поля определены одинаково, сопоставление одинаково. Почему он терпит неудачу?почему этот внешний ключ не в состоянии

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; 
+0

Gordon, ни одно из полей в попытке FK не является INT или BIGINT. Все 3 являются VARCHAR, а размеры соответствуют – Richard

+0

Столбцы, на которые ссылается внешний ключ, должны быть проиндексированы. – Barmar

ответ

1

Вам нужен индекс в таблице fitness_pledges для (first_name, last_name, email) первой. От Using FOREIGN KEY Constraints:

MySQL требует индексов на внешних ключах и ссылочных ключах, чтобы проверки внешнего ключа могли быть быстрыми и не требовать сканирования таблицы.

Он автоматически создаст индекс в таблице ссылок, если это необходимо, но это не относится к таблице, на которую делается ссылка.

Так что вам нужно сделать:

CREATE INDEX first_last_email ON fitness_pledges (first_name, last_name, email); 
+0

@absolutely perfect boss +1 –

+0

Спасибо, Barmar. Не могу поверить, что я забыл об этом! :( – Richard

0

По стандарту SQL, внешний ключ должен ссылаться либо на первичный ключ или уникальный ключ родительской таблицы. Если первичный ключ имеет несколько столбцов, внешний ключ должен иметь одинаковый номер и порядок столбцов

+0

Спасибо, Hitesh, за подтверждение того, что Barmar siad – Richard

Смежные вопросы