2016-03-29 15 views
0

Zum Beispiel habe ich diese Tabellen und Daten:Nullify Spaltenwerte der gelöschten Zeilen

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

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

Was ich will, ist, alle Zeilen in logo Tabelle zu löschen, und die Werte zunichte machen, die sie sich bezieht. Beispiel:

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

TABLE: logo (now emptied) 
  • Ich versuchte TRUNCATE ... CASCADE verwenden, aber es gelöscht auch alle Zeilen in der Tabelle logo_user.
  • Ich erwäge auch, die Fremdschlüssel-Einschränkung der logo_user zu kaskadieren auf löschen, aber es ist zu viel Arbeit. In Wirklichkeit habe ich viele Tabellen, die sich auf logo Tabelle beziehen.
+2

Die Verwendung eines FK mit 'on delete set null 'ist der einzige" automatische "Weg, dies zu tun. Es wird viel weniger Arbeit sein, als jede einzelne Löschanweisung zu ändern, um mit allen verwandten Tabellen umzugehen. –

Antwort

0

können Sie die folgende Lösung für Ihr Problem verwenden.

ON DELETE SET NULL 

auf einem Fremdschlüssel in Ihrer Haupttabelle wird das Problem in einem Schritt lösen. Was es im Grunde tut ist: Wenn ein Datensatz in der übergeordneten Tabelle gelöscht wird, dann werden die Fremdschlüsselfelder in den entsprechenden Datensätzen in der untergeordneten Tabelle auf null gesetzt (die Spalten, die Sie im Schlüssel erwähnen würden). Die Datensätze in der untergeordneten Tabelle werden nicht gelöscht, die entsprechenden Werte werden entsprechend Ihrer Anforderung auf null aktualisiert. Sie können beispielsweise auf die folgenden Syntax verweisen:

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

Während dieser Code die Frage beantworten kann, zusätzliche Kontext in Bezug auf _why_ und/oder _how_ dieser Code Antworten die Frage würde erheblich verbessern langfristigen Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung zu hinzuzufügen. –

+0

hat eine Erklärung hinzugefügt :) @TobySpeight –

+0

Danke dafür! Ich habe deine Lösung ein wenig verändert. Anstatt eine Tabelle zu erstellen, habe ich die 'logo_user'-Tabellen aktualisiert, indem ich ihre Fremdschlüssel-Einschränkung gelöscht habe und sie erneut mit' ON DELETE SET NULL 'hinzugefügt habe. – KaNa0011

0

Ich weiß nicht, warum es „zu viel Arbeit“ ist die Fremdschlüssel zu ON DELETE SET NULL zu ändern - es ist nicht nur der einfachste Weg ist, werden Sie es zu tun haben, da der Standard NO ACTION verhindert, dass Sie ohne eine Kaskade löschen.

Verwandte Themen