Обмен сообщениями MySQL обычно вводит меня в заблуждение.
В реляционных базах данных внешние ключи могут указывать только на:
- Первичные ключи или
- Уникальные ограничения. Вот и все.
В этом случае вы не говорите о первичном ключе, поэтому вам нужно уникальное ограничение (которое может называться UNIQUE INDEX
или UNIQUE KEY
в MySQL lin go). Слово index обычно используется для быстрого доступа к данным, но не для ссылочной целостности.
Примечание : некоторые индексы могут использоваться для обеспечения правил уникальности, с которыми не могут работать ограничения SQL, особенно частичные уникальные индексы. Но это другая история.
Вы можете создать уникальное ограничение как:
alter table loan
add constraint uq1 unique (`Customer ID`, `Bank Account`);
Полный рабочий пример может быть:
create table loan (
id int primary key not null,
`Customer ID` int,
`Bank Account` int
);
alter table loan
add constraint uq1 unique (`Customer ID`, `Bank Account`);
create table item (cid int, acc int, val int,
constraint fk1 foreign key (cid, acc)
references loan (`Customer ID`, `Bank Account`)
);
insert into loan (id, `Customer ID`, `Bank Account`) values (1, 20, 30); -- succeeds
insert into loan (id, `Customer ID`, `Bank Account`) values (2, 21, 31); -- succeeds
insert into loan (id, `Customer ID`, `Bank Account`) values (3, 20, 30); -- fails!
См. Рабочий пример на DB Fiddle .