394 Stimmen

Wie verwende ich die Kaskadenlöschung mit SQL Server?

Ich habe 2 Tabellen: T1 und T2, es sind bestehende Tabellen mit Daten. Zwischen T1 und T2 besteht eine Eins-zu-viele-Beziehung. Wie ändere ich die Tabellendefinitionen, um ein kaskadierendes Löschen in SQL Server durchzuführen, wenn ein Datensatz aus T1 gelöscht wird, werden alle zugehörigen Datensätze in T2 ebenfalls gelöscht.

Zwischen ihnen besteht die ausländische Beschränkung. Ich möchte die Tabellen nicht löschen oder einen Trigger erstellen, um die Löschung für T2 durchzuführen. Wenn ich z. B. einen Mitarbeiter lösche, sollten auch alle Überprüfungsdatensätze gelöscht werden.

T1 - Mitarbeiter,

Employee ID      
Name
Status

T2 - Leistungsbeurteilungen,

Employee ID - 2009 Review
Employee ID - 2010 Review

435voto

Mike Gledhill Punkte 25646

So fügen Sie "Cascade delete" zu einem vorhandenen Fremdschlüssel in SQL Server Management Studio hinzu:

Wählen Sie zunächst Ihren Fremdschlüssel aus, und öffnen Sie dessen "DROP and Create To " in einem neuen Abfragefenster.

enter image description here

Dann fügen Sie einfach ON DELETE CASCADE zum ADD CONSTRAINT Befehl:

n Klicken Sie auf die Schaltfläche "Ausführen", um diese Abfrage auszuführen.

Sie können übrigens dieses Skript ausführen, um eine Liste Ihrer Fremdschlüssel zu erhalten und zu sehen, bei welchen die Option "Kaskadenlöschung" aktiviert ist:

SELECT 
   OBJECT_NAME(f.parent_object_id) AS 'Table name',
   COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
   delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
     sys.foreign_key_columns AS fc,
     sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1

Und wenn Sie jemals feststellen, dass Sie nicht in der Lage sind DROP eine bestimmte Tabelle aufgrund einer Fremdschlüssel-Beschränkung, aber Sie können nicht herausfinden, welcher FK das Problem verursacht, dann können Sie diesen Befehl ausführen:

sp_help 'TableName'

Die SQL in diesem Artikel listet alle FKs auf, die auf eine bestimmte Tabelle verweisen.

Ich hoffe, das alles hilft.

Entschuldigung für den langen Finger. Ich habe nur versucht, einen Punkt zu machen.

412voto

marc_s Punkte 701497

Das müssen Sie tun,

  • Löschen Sie die vorhandene Fremdschlüssel-Beschränkung,
  • Fügen Sie eine neue mit der Option ON DELETE CASCADE Einstellung aktiviert.

Etwa so:

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE

182voto

Palanikumar Punkte 6632

Sie können dies mit SQL Server Management Studio tun.

Klicken Sie mit der rechten Maustaste auf den Tabellenentwurf, gehen Sie zu Beziehungen und wählen Sie im linken Fenster den Fremdschlüssel aus. Erweitern Sie im rechten Fenster das Menü "INSERT- und UPDATE-Spezifikation" und wählen Sie "Kaskade" als Löschregel.

SQL Server Management Studio

53voto

Hyperboreus Punkte 31109

Verwenden Sie etwas wie

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;

Geben Sie die richtigen Spaltennamen ein, und Sie sollten fertig sein. Wie mark_s richtig feststellte, müssen Sie, wenn Sie bereits eine Fremdschlüssel-Beschränkung haben, möglicherweise zuerst die alte löschen und dann die neue erstellen.

25voto

Md Shahriar Punkte 1266

ON DELETE CASCADE
Sie legt fest, dass die untergeordneten Daten gelöscht werden, wenn die übergeordneten Daten gelöscht werden.

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);

Für diesen Fremdschlüssel haben wir die ON DELETE CASCADE Klausel, die SQL Server anweist, die entsprechenden Datensätze in der untergeordneten Tabelle zu löschen, wenn die Daten in der übergeordneten Tabelle gelöscht werden. Wenn also in diesem Beispiel ein product_id-Wert aus der Tabelle products gelöscht wird, werden die entsprechenden Datensätze in der Tabelle inventory, die diese product_id verwenden, ebenfalls gelöscht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X