Автоматическая очистка SQL с таблицами 0..1: 1..n в MySQL - PullRequest
1 голос
/ 24 мая 2011

Я пишу приложение, которое требует от всех пользователей доступа к данным в центральной базе данных с использованием MySQL, и мне было интересно кое-что.

Допустим, у меня есть эта настройка.

CREATE TABLE A
(
    id   INT PRIMARY KEY AUTO_INCREMENT,
    data INT NOT NULL;
);

CREATE TABLE B
(
   id    INT PRIMARY KEY AUTO_INCREMENT,
   a_id  INT,
   FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE SET NULL
);

Теперь, как я хочу, чтобы это было настроено, так это то, что на таблицу A ВСЕГДА должна ссылаться строка в таблице B. Однако строка в таблице B может или не может ссылаться на строку в таблице A. Отношение равно 1: n в том, что несколько строк в таблице B могут ссылаться на одну строку в таблице A. Мне просто интересно, возможно ли, чтобы база данных MySQL автоматически удаляла строку в A, если на нее больше не ссылается ни одна строка в таблице B.

Идея в том, что я могу просто установить a_id в таблице B в NULL и очистить базу данных, что бы там ни было. Я думаю, что это похоже на сборку мусора в Java сейчас, когда я думаю об этом. Если нет ключа для автоматического применения ограничения, будет ли запускаться триггер после обновления?

РЕДАКТИРОВАТЬ: Добавление в дополнительное отношение отношения.

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Выполните следующий запрос через определенный интервал:

DELETE tableA
FROM tableA LEFT JOIN tableB B ON A.id = B.a_id
WHERE B.a_id IS NULL;

Или, чтобы обеспечить согласованность в реальном времени, вы можете создать триггер OnChange для tableB, который выполняет аналогичные действия.

0 голосов
/ 24 мая 2011

Есть ли причина для используемой вами структуры таблицы? То, как вы используете внешние ключи, смотрит назад ко мне. Вместо того чтобы поместить ключ в таблицу B, вы можете переместить его в таблицу A.

Это даст вам структуру, которая будет больше похожа на:

tableA columns        tableB columns
  id
  b_id                id
  [values]            [values]

  fk: a.b_id=b.id

Запись, добавленная в таблицу A, потребует соответствующего поля в таблице B, но B будет свободен, чтобы не иметь значений в таблице A. Тогда, если вы хотите удалить значения в таблице A, вы можете просто использовать: 1006 *

delete from tableA where b_id=[recordIdToNull];

Вы даже можете установить внешний ключ A для каскадных действий, выполняемых на B, поэтому любые значения, удаленные из B, также удалят соответствующие строки в A.

...