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 шт):

Автор решения: Akina

Можно ли делать связь между двумя таблицами двумя внешними ключами ?

Да сколько угодно - 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, никакой другой информации нет - зачем создавать фактически пустую запись?

→ Ссылка