Целостность внешних ключей в таблице, где первый FK является PK в одной таблице, но не один во второй - PullRequest
0 голосов
/ 18 июня 2020
CREATE TABLE table1
(
   id INT NOT NULL PRIMARY KEY,
   some_data VARCHAR(100) NOT NULL
)

CREATE TABLE table2
(
   id INT NOT NULL PRIMARY KEY,
   table1_id INT NOT NULL,
   some_data VARCHAR(30) NOT NULL,

   CONSTRAINT fk_table2_table1 FOREIGN KEY (table1_id) REFERENCES table1(id)
)

CREATE TABLE table3
(
   id INT NOT NULL PRIMARY KEY,
   table1_id INT NOT NULL,
   table2_id INT NOT NULL,
   some_data VARCHAR(30) NOT NULL,

   CONSTRAINT fk_table3_table2 FOREIGN KEY (table2_id) REFERENCES table2(id)
   CONSTRAINT fk_table3_table1 FOREIGN KEY (table1_id) REFERENCES table1(id)
)

Хотя ограничения fk для table3 поддерживают целостность наличия / проверки значений table1_id и table2_id, я ищу способ также проверить целостность table1_id на table1_id в table2, где table2 ( id) - это table2_id. Есть ли способ проверить это ограничение в MySQL?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

В реляционных базах данных внешние ключи не проверяются транзитивно. Единственный способ убедиться, что FK хорошо связаны , как вы хотите, - это использовать составные ключи. Например:

CREATE TABLE table1 (
   id INT NOT NULL PRIMARY KEY,
   some_data VARCHAR(100) NOT NULL
)

CREATE TABLE table2 (
   table1_id INT NOT NULL,
   id INT NOT NULL,
   some_data VARCHAR(30) NOT NULL,

   PRIMARY KEY (table1, id), -- composite PK
   CONSTRAINT fk_table2_table1 FOREIGN KEY (table1_id) REFERENCES table1(id)
)

CREATE TABLE table3 (
   table1_id INT NOT NULL,
   table2_id INT NOT NULL,
   id INT NOT NULL PRIMARY KEY,
   some_data VARCHAR(30) NOT NULL,

   PRIMARY KEY (table1_id, table2_id, id), -- optional composite PK
   CONSTRAINT fk_table3_table2 FOREIGN KEY (table1_id, table2_id) 
     REFERENCES table2 (table1_id, id) -- references table_2 composite PK
)
0 голосов
/ 18 июня 2020

Три таблицы недостаточно нормализованы и фактически могут привести к дублированию данных. Вам не нужно ссылаться на table1_id в table3, поскольку на него уже есть ссылка в table2. Запись table2 уже ссылается на table1_id. Вам просто нужно удалить table1_id в table3 плюс ограничение fk_table3_table1, и все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...