2016-03-29 2 views
0

Например, у меня есть эти таблицы и данные:аннулирует значение столбцов удаленных строк

TABLE: logo_user 
+----+---------+ 
| id | logo_id | 
+----+---------+ 
| 1 | 1  | 
| 2 | 2  | 
+----+---------+ 

TABLE: logo 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
+----+ 

То, что я хочу, чтобы удалить каждые строки в таблице logo, и свести на нет значения, что относится к нему. Пример:

TABLE: logo_user 
+----+---------+ 
| id | logo_id | 
+----+---------+ 
| 1 | NULL | 
| 2 | NULL | 
+----+---------+ 

TABLE: logo (now emptied) 
  • Я попытался с помощью TRUNCATE ... CASCADE, но он также удаляется каждые строки в таблице logo_user.
  • Я также рассматриваю изменение ограничения внешнего ключа logo_user на каскад при удалении, но это слишком много работы. На самом деле у меня много таблиц со ссылкой на таблицу logo.
+2

Использование FK с 'on delete set null 'является единственным« автоматическим »способом этого. Это будет намного меньше работы, а затем изменение каждого каждого заявления на удаление для обработки всех связанных таблиц. –

ответ

0

Вы можете использовать нижеследующее решение проблемы.

ON DELETE SET NULL 

внешний ключ в вашем главном столе решит проблему за один шаг. В основном это делается: , если запись в родительской таблице удалена, то соответствующие записи в дочерней таблице будут иметь поля внешнего ключа, установленные в null (столбцы, которые вы укажете в ключе). Записи в дочерней таблице не будут удалены, соответствующие значения будут обновлены до нуля в соответствии с вашим требованием. Например, вы можете обратиться к синтаксисе ниже:

CREATE TABLE table_name 
(
column1 datatype null/not null, 
column2 datatype null/not null, 
    ... 

CONSTRAINT fk_col 
FOREIGN KEY (column1, column2, ... column_n) 
REFERENCES parent_table (column1, column2, ... column_n) 
ON DELETE SET NULL 
); 
+0

Хотя этот код может ответить на вопрос, предоставив дополнительный контекст относительно _why_ и/или _how_ этот код ответил на вопрос, значительно улучшив его долгосрочное значение. Пожалуйста, отредактируйте свой ответ, чтобы добавить описание . –

+0

добавил объяснение :) @TobySpeight –

+0

Спасибо за это! Я немного изменил ваше решение. Вместо создания таблицы я обновлял таблицы 'logo_user', отбрасывая ограничение внешнего ключа и добавляя его снова с помощью' ON DELETE SET NULL'. – KaNa0011

0

Я не знаю, почему это «слишком много работы», чтобы изменить внешние ключи ON DELETE SET NULL - это не только самый простой способ, вам придется это сделать поскольку по умолчанию NO ACTION будет препятствовать удалению без каскада.