2013-07-03 5 views
2

Я задаюсь вопросом, почему я не могу быть в состоянии добавить эти иностранные keys.This моя схеманесколько внешних ключей не может быть добавлен

CREATE TABLE members(
    member_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(50) NOT NULL, 
    num_1 int, 
    num_2 int, 
    password VARCHAR(50) NOT NULL, 
    PRIMARY KEY (member_id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE contacts(
    contact_id INT NOT NULL AUTO_INCREMENT, 
    s1 int, 
    phone_number VARCHAR(10) NOT NULL, 
    s2 int, 
    s3 int, 
    PRIMARY KEY (contact_id), 
    FOREIGN KEY (s1) REFERENCES members(num_1) ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (s2) REFERENCES members(num_2) ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (s3) REFERENCES members(member_id) ON DELETE CASCADE ON UPDATE CASCADE 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 

Я получаю эту ошибку на тузд терминале ERROR 1215 (HY000): Cannot add foreign key constraint

Есть ли проблема с моей схемой ?.

+1

у вас может не быть указателя на 'num_1' и' num_2'. что может быть причиной –

+0

Обычно внешнему ключу нужен первичный ключ в справочной таблице –

+0

@JanneMatikainen Я думаю, что уникальный ключ – chetan

ответ

5

Работы для меня этот путь:

CREATE TABLE members(
    member_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(50) NOT NULL, 
    num_1 int, 
    num_2 int, 
    password VARCHAR(50) NOT NULL, 
    PRIMARY KEY (member_id), 
    key idx_num1 (num_1), 
    key idx_num2 (num_2) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE contacts(
    contact_id INT NOT NULL AUTO_INCREMENT, 
    s1 int, 
    phone_number VARCHAR(10) NOT NULL, 
    s2 int, 
    s3 int, 
    PRIMARY KEY (contact_id), 
    FOREIGN KEY (s1) REFERENCES members(num_1) ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (s2) REFERENCES members(num_2) ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (s3) REFERENCES members(member_id) ON DELETE CASCADE ON UPDATE CASCADE 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Просто добавил

key idx_num1 (num_1), 
    key idx_num2 (num_2) 

в члены таблицы. Внешние ключи должны ссылаться на индексированный столбец (необязательно уникальный и необязательно NOT NULL в состоянии).

От manual:

InnoDB позволяет внешний ключ для ссылки на какой-либо индекс столбца или группы столбцов. Однако в ссылочной таблице должен быть индекс, в котором ссылочные столбцы указаны в качестве первых столбцов в том же порядке.

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