Проблема с ограничениями внешнего ключа и построением БД Mysql - PullRequest
0 голосов
/ 15 марта 2020

У меня проблема с продумыванием способа соединения двух таблиц. У меня есть одна таблица с действиями (RAD):

CREATE TABLE RAD (
  rad_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  spec_id INT NULL,
  predp_id INT NULL,
  predf_id INT NULL,
  strp_ID INT NULL,
  strf_ID INT NULL,
---more fileds---
  FOREIGN KEY (spec_id) REFERENCES SPEC(spec_id) ON DELETE SET NULL,    
  FOREIGN KEY (strp_ID) REFERENCES STRANKEP(strp_ID) ON DELETE CASCADE,
  FOREIGN KEY (strf_ID) REFERENCES STRANKEF(strf_ID) ON DELETE CASCADE,
  FOREIGN KEY (predp_id) REFERENCES PREDMETIP(predp_id) ON DELETE CASCADE,
  FOREIGN KEY (predf_id) REFERENCES PREDMETIF(predf_id) ON DELETE CASCADE
) ENGINE=InnoDB COLLATE utf8_general_ci;

и одна таблица спецификаций (SPE C), на основе которой будет составлен счет:

CREATE TABLE SPEC (
  spec_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   ---more fileds---    
) ENGINE=InnoDB COLLATE utf8_general_ci;

Как вы можете см. action rad_id (RAD) строка будет удалена, если будет удален какой-либо клиент (strp_ID или strf_ID). То же самое касается регистра (predp_id и predf_id).

Теперь я хочу ограничить удаление действия rad_id (строка RAD), если оно включено в спецификацию. Поэтому, когда спецификация сделана, она вставляет spec_id (SPE C) в поле spe c -id (RAD).

Когда спецификация удалена, поле возвращается к нулю, и это работает. НО это позволяет мне удалить действие rad_id (RAD), когда оно было включено в спецификацию (SPE C), и этот внешний ключ spec_id включен в таблицу RAD. И я не могу этого допустить. Его следует удалять только в том случае, если его нулевой ключ и ключ спецификации отсутствуют.

Проблема заключается в том, что спецификация будет содержать МНОЖЕСТВЕННЫЕ действия rad_id (RAD), поэтому я не могу t ie его с еще одним столбцом rad_id (RAD) как внешний ключ.

Я не знаю, как решить эту проблему.

     RAD TABLE  
rad_id  spec_id
1       1
2       1
3       1
4       null

        SPEC TABLE  
spec_id     rad_id-reference
1           1,2,3

Как видно выше, строка таблицы SPE C будет состоять из 3 rad_id, мне нужен способ сказать rad_id 1,2 и 3 не могут быть удалены, если spec_id 1 существует. rad_id 4 можно удалить.

Проблема в том, что я не могу сделать rad_id-reference для таблицы SPE C FOREIGN KEY, составленным из 3 rad_id.

1 Ответ

0 голосов
/ 16 марта 2020

Я нашел способ сделать это. http://sqlfiddle.com/#! 9 / 50de2 / 1 Если изменить значение удаления на 1, произойдет сбой.

     RAD TABLE  
rad_id-PK
1       
2       
3       
4       

        SPEC TABLE  
spec_id-PK
1
2

    RESTRICTDEL TABLE
res_id-PK  spec_id-FK  rad_id-FK
1           1           1
2           1           2
3           2           2
4           2           3
5           2           3

Я создал другую таблицу, которая будет содержать оба идентификатора PK в одном столбце, и они являются FK. один - PK, и он будет уникальным, как spec_id из таблицы SPE C. второй это rad_id, который может быть удвоен. Я просто должен установить SET foreign_key_checks = 0; и назад 1, когда я закончу вставлять новую спецификацию. Также нужно будет l oop с php и для каждого rad_id сделать новую запись resdel_id. Таким образом, несколько rad_id не будут удалены, если к ним подключен один spec_id.

...