У меня проблема с продумыванием способа соединения двух таблиц. У меня есть одна таблица с действиями (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.