Wie UPDATE verwenden, DELETE und SQL-Anweisungen INSERT

Zusätzlich zu WÄHLEN Aussagen, AKTUALISIEREN, LÖSCHEN, und EINFÜGEN SQL-Anweisungen können auch enthalten WOHER Klauseln. Jene WOHER Klauseln können Subqueries in gleicher Weise enthalten, dass WÄHLEN Aussagen 'WOHER Klauseln tun.

Zum Beispiel hat Zetec gerade einen Volumen Kaufvertrag mit Olympia-Vertrieb und will Olympic mit einer rückwirkenden 10 Prozent Kredit zur Verfügung zu stellen für alle seine Einkäufe im letzten Monat. Sie können diesen Kredit mit einer geben AKTUALISIEREN Erklärung:

UPDATE TRANSMASTERSET NetAmount = NetAmount * 0.9WHERE Saledate> (System - 30) TAG UND CustID = (SELECT CustIDFROM CUSTOMERWHERE Unternehmen = 'Olympic Sales') -

Sie können auch eine korrelierte Unterabfrage in eine haben AKTUALISIEREN Erklärung. Angenommen, der CUSTOMER-Tabelle eine Spalte LastMonthsMax, und Zetec möchte einen solchen Kredit für den Kauf zu geben, die nicht überschreiten LastMonthsMax für den Kunden:

UPDATE TRANS TMSET NetAmount = NetAmount * 0.9WHERE NetAmount> (SELECT LastMonthsMaxFROM KUNDEN CWHERE C.CustID = TM.CustID) -

Beachten Sie, dass diese Unterabfrage korreliert ist: Die WOHER Klausel in der letzten Zeile Referenzen sowohl die CustID der KUNDE Zeile aus der Unterabfrage und die CustID der aktuellen TRANS Zeile, die ein Kandidat für die Aktualisierung ist.

Eine Unterabfrage in ein AKTUALISIEREN Aussage können auch die Tabelle verweisen, die aktualisiert wird. Nehmen wir an, Zetec will eine 10-prozentige Kredit an Kunden, deren Einkäufe zu geben überschritten $ 10.000:

UPDATE TRANS TM1SET NetAmount = NetAmount * 0.9WHERE 10000 lt; (SELECT SUM (NetAmount) FROM TRANS TM2WHERE TM1.CustID = TM2.CustID) -

Die innere Unterabfrage berechnet die SUMME des Netto-Betrag Spalte für alle TRANS Zeilen für den gleichen Kunden. Was bedeutet das? Angenommen, der Kunde mit CustID = 37 hat vier Reihen in TRANS mit Werten für Netto-Betrag: 3000, 5000, 2000, und 1000. Das SUMME von Netto-Betrag dafür CustID ist 11000.

Die Reihenfolge, in der die AKTUALISIEREN Anweisung verarbeitet die Zeilen wird durch die Implementierung definiert und ist in der Regel nicht vorhersehbar. Die Reihenfolge kann je nachdem, wie die Reihen auf der Platte angeordnet sind. Es sei angenommen, dass die Umsetzung der Zeilen für diese Prozesse CustID in dieser Reihenfolge: zuerst die TRANS mit einem Netto-Betrag von 3000, dann derjenige mit Netto-Betrag= 5000, und so weiter.

Nach den ersten drei Zeilen für CustID 37 wurden aktualisiert, ihre Netto-Betrag Werte 2700 (90 Prozent der $ 3000), 4500 (90 Prozent von $ 5.000) und 1800 (90 Prozent der $ 2.000). Dann, wenn Sie verarbeiten die letzte Zeile für TRANS CustID 37 (deren Netto-Betrag ist 1000), das SUMME zurückgegeben würde von der Unterabfrage scheinen sein 10000, und die alte Netto-Betrag Wert der letzten Zeile CustID 37.

So scheint es, dass die letzte Zeile für CustID 37 nicht, weil der Vergleich mit dem aktualisierten SUMME nicht wahr ist - nach allem, 10000 nicht kleiner ist als 10000. Aber das ist nicht, wie die AKTUALISIEREN Anweisung definiert wird, wenn eine Unterabfrage der Tabelle verweist, die aktualisiert wird.

Alle Auswertungen von Unterabfragen in einer AKTUALISIEREN Anweisung zu verweisen, die alten Werte der Tabellen- diejenigen, die aktualisiert werden. In dem vorhergehenden AKTUALISIEREN für CustID 37, dass die Unteranfrage 11000 - das Original SUMME.

Die Unterabfrage in ein WOHER Klausel funktioniert wie ein WÄHLEN Anweisung oder ein AKTUALISIEREN Erklärung. Dasselbe gilt für LÖSCHEN und EINFÜGEN. Um alle Olympic Transaktionen zu löschen, verwenden Sie diese Anweisung:

DELETE FROM TRANSMASTERWHERE CustID = (SELECT CustIDFROM CUSTOMERWHERE Unternehmen = 'Olympic Sales') -

Wie bei AKTUALISIEREN, LÖSCHEN Unterabfragen können auch in Beziehung gesetzt werden und können auch die Tabelle verweisen, gelöscht werden. Die Regeln sind ähnlich wie die Regeln für AKTUALISIEREN Subqueries. Angenommen, Sie alle Zeilen aus TRANS für Kunden, deren Gesamt löschen möchten Netto-Betrag ist größer als $ 10000:

DELETE FROM TRANS TM1WHERE 10000 lt; (SELECT SUM (NetAmount) FROM TRANS TM2WHERE TM1.CustID = TM2.CustID) -

Diese Abfrage löscht alle Zeilen aus TRANS, die haben CustID 37, sowie alle anderen Kunden mit Käufen von mehr als $ 10.000. Alle Verweise auf TRANS in der Unterabfrage bezeichnen den Inhalt TRANS vor allen Löschungen, die von der aktuellen Anweisung. Also, auch wenn Sie das Löschen der letzten Zeile für TRANS CustID 37, wird die Unterabfrage auf der ursprünglichen TRANS Tabelle und kehrt ausgewertet 11000.

Wenn Sie aktualisieren, zu löschen oder Datenbankeinträge einfügen, riskieren Sie die Daten einer Tabelle nicht mit anderen Tabellen in der Datenbank zu machen. Eine solche Widersprüchlichkeit heißt ein Änderung anomaly. Wenn Sie TRANS Aufzeichnungen und eine TRANSDETAIL Tabelle hängt von TRANS zu löschen, müssen Sie die entsprechenden Datensätze aus TRANSDETAIL, zu löschen.

Dieser Vorgang wird als ein Kaskadierung löschen, weil das Löschen eines übergeordneten Datensatz mit seiner zugeordneten untergeordneten Datensätze Kaskade muss. Andernfalls werden die undeleted Kind Aufzeichnungen Waisen. In diesem Fall würden sie Rechnung Detaillinien, die in der Schwebe sind, weil sie nicht mehr zu einem Rechnungsdatensatz verbunden sind.

Wenn Ihre Implementierung von SQL unterstützt keine Löschungen Kaskadierung, müssen Sie die Löschungen selbst tun. In diesem Fall löschen Sie die entsprechenden Datensätze aus der untergeordneten Tabelle, bevor Sie den entsprechenden Datensatz aus der Mutter löschen. Auf diese Weise haben Sie keine verwaisten Datensätze in der untergeordneten Tabelle, auch für eine Sekunde.

Menü