In diesem Beispiel können Sie die "gelöschte" Pseudotabelle nutzen. Etwas wie:
begin transaction;
declare @deletedIds table ( id int );
delete from t1
output deleted.id into @deletedIds
from table1 as t1
inner join table2 as t2
on t2.id = t1.id
inner join table3 as t3
on t3.id = t2.id;
delete from t2
from table2 as t2
inner join @deletedIds as d
on d.id = t2.id;
delete from t3
from table3 as t3 ...
commit transaction;
Natürlich können Sie eine "Ausgabe gelöscht" ausführen. auch beim zweiten Löschen, wenn Sie etwas für die dritte Tabelle benötigen.
Als Randnotiz können Sie auch einfügen. * In eine Einfügeanweisung und beide eingefügt. * Und gelöscht. * In eine Aktualisierungsanweisung.
EDIT:
Haben Sie auch darüber nachgedacht, einen Trigger für Tabelle1 hinzuzufügen, um ihn aus Tabelle2 + 3 zu löschen? Sie befinden sich innerhalb einer impliziten Transaktion und haben auch die Pseudotabellen "eingefügt " und "gelöscht " verfügbar.
Sie können jederzeit kaskadierende Löschvorgänge für die Beziehungen der Tabellen einrichten.
Sie können die mehreren Löschvorgänge in einer gespeicherten Prozedur kapseln.
Sie können eine Transaktion verwenden, um eine Arbeitseinheit sicherzustellen.
quelle
Sie können die JOIN-Syntax in der FROM-Klausel in DELETE in SQL Server verwenden, aber Sie löschen immer noch nur aus der ersten Tabelle und der proprietären Transact-SQL-Erweiterung, die eine Alternative zur Unterabfrage darstellt.
Aus dem Beispiel hier :
quelle
Beispiel zum Löschen einiger Datensätze aus der Mastertabelle und entsprechender Datensätze aus zwei Detailtabellen:
quelle
SELECT INTO #DeleteIds
anstattCREATE TABLE 'DeleteIds
gefolgt vonINSERT INTO 'DeleteIds...
?Ich frage mich nur ... ist das in MySQL wirklich möglich? es wird t1 und t2 löschen? oder ich habe die Frage einfach falsch verstanden.
Wenn Sie jedoch nur Tabelle1 mit mehreren Verknüpfungsbedingungen löschen möchten, geben Sie der zu löschenden Tabelle keinen Alias
Dies:
sollte so geschrieben werden, um in MSSQL zu funktionieren:
im Gegensatz dazu, wie die beiden anderen gängigen RDBMS einen Löschvorgang ausführen:
http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html
quelle
Grundsätzlich müssen Sie in einer Transaktion nicht drei Löschanweisungen machen, zuerst Kinder und dann Eltern. Das Einrichten von kaskadierenden Löschvorgängen ist eine gute Idee, wenn dies keine einmalige Sache ist und ihre Existenz nicht mit einem vorhandenen Trigger-Setup in Konflikt steht.
quelle
In SQL Server gibt es keine Möglichkeit, mehrere Tabellen mithilfe von Join zu löschen. Sie müssen also zuerst das untergeordnete Element löschen, bevor Sie das übergeordnete Formular löschen können.
quelle
Dies ist eine alternative Möglichkeit, Datensätze zu löschen, ohne Waisen zu hinterlassen.
quelle
Alles wurde darauf hingewiesen. Verwenden Sie einfach entweder
DELETE ON CASCADE
auf dem übergeordnetentable
oder löschen Sie von derchild-table
auf dieparent
.quelle
Wie Aaron bereits betont hat, können Sie das Löschverhalten auf CASCADE setzen. Dadurch werden untergeordnete Datensätze gelöscht, wenn ein übergeordneter Datensatz gelöscht wird. Wenn Sie nicht möchten, dass irgendeine andere Magie geschieht (in diesem Fall wären die Punkte 2, 3 von Aarons Antwort nützlich), verstehe ich nicht, warum Sie mit inneren Verknüpfungen löschen müssen.
quelle
Um auf John Gibbs Antwort aufzubauen und einen Datensatz in zwei Tabellen mit einer FK-Beziehung zu löschen:
quelle
quelle
$ sql = "DELETE FROM
basic_tbl
,education_tbl
,personal_tbl
,address_tbl
, weiterdepartment_tbl
verwendenbasic_tbl
,education_tbl
,personal_tbl
,address_tbl
,department_tbl
WOb_id
=e_id
=p_id
=a_id
=d_id
= '" $ id.. "‘ „; $ rs = mysqli_query ($ con, $ sql);quelle