sql, Внешний ключ
Можно ли делать связь между двумя таблицами двумя внешними ключами ? Если да , то в чем ошибка ?
create table if not exists first(
id int not null auto_increment primary key,
Surname varchar(40) not null,
Name varchar(40) not null,
Patronymic varchar(40),
Birth datetime not null default current_timestamp,
phone varchar(20)
);
create table if not exists second(
contact_id int not null auto_increment primary key,
Person_ID int,
phone varchar(20),
mail varchar(30),
address varchar(40),
foreign key(Person_ID) references first(id),
foreign key(phone) references first(phone)
);
что нужно добавить в код , чтобы при появление строчки с человеком в first ,в second автоматически появлялась строчка где указан
Ответы (1 шт):
Можно ли делать связь между двумя таблицами двумя внешними ключами ?
Да сколько угодно - FOREIGN KEY независимы.
Если да , то в чем ошибка ?
Поле, на которое ссылается FK (в данном случае это first(phone)) должно быть префиксом какого-либо индекса. Об этом явно сообщает и текст ошибки:
Failed to add the foreign key constraint. Missing index for constraint 'second_ibfk_2' in the referenced table 'first'
Для исправления нужно создать такой индекс:
CREATE INDEX first_phone ON first (phone);
После этого вторая таблица будет создана без проблем: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=62c4a530d370760b3f1aca1494086623
Однако наличие поля phone в таблице second вообще избыточно - ибо его значение однозначно определяется по Person_ID. Следует удалить это поле и соответствующий внешний ключ из структуры таблицы, а при необходимости получать значение в запросе на основании связи.
что нужно добавить в код , чтобы при появление строчки с человеком в first ,в second автоматически появлялась строчка где указан
Триггер AFTER INSERT. Но лучше делать такие операции явно - либо выполнять запись в первую таблицу и реферальную запись во вторую в хранимой процедуре, либо клиентским кодом. Основной резон в том, что, кроме собственно Person_ID, никакой другой информации нет - зачем создавать фактически пустую запись?