Verschieben von Zeilen zwischen Tabellen in SQL
Ich habe 2 Tabellen, eine aktive Tabelle und eine inaktive Tabelle. Ich möchte bewegen Zeilen aus der aktiven auf die inaktive Tabelle. Mein Erster Gedanke war
insert into inactive select * from active where ...
delete from active active where ...
Jedoch über .42 Sekunden später bemerkte ich dies löschen/duplizieren von Zeilen, wenn updates verändern, was die where-Klausel wählt.
In diesem Fall kann ich einfach verhindern, das aber, was soll ich tun, in Fällen, in denen ich nicht kann?
edit: Von den Antworten, die es so Aussehen, dass es nicht eine einfache/triviale Weg, dies zu tun. Ich bin wirklich überrascht von diesem. Ich würde denken, dass gäbe es einige erhebliche Vorteile zu haben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Status-flags sind dein Freund.
Wenn Sie dies tun mit Autocommit aus ist, wird es ergreifen, sperrt alle über dem Platz.
Kannst du nach jedem Schritt, wenn Sie wollen, eine etwas weniger sperren.
Error: no such module: FTS3
. Ich kann nicht finden, eine sqlite3-binary für Android-mit FTS3...(In MS SQL-mindestens), die Sie nutzen könnten Transaktionen und sperren-Hinweise:
Ohne sperrhinweis (updlock) können deadlocks auftreten, wenn sich jemand verändert die Datensätze gelöscht.
Error: near "(": syntax error
Enthält Ihre Datenbank-support der OUTPUT-Klausel? Dann könnte dies zu einem perfekten und einfach zu befolgen Sie die Lösung für Sie, nicht wahr?
http://msdn.microsoft.com/en-us/library/ms177564.aspx
Wenn Sie sperren können Sie die Zeilen pessimistisch, das ist so, wie Sie Sie Lesen, um Sie zu kopieren in die inaktive Tabelle, dann kann niemand Sie ändern unter Euch.
Die Methode zum sperren der Zeilen variiert von Datenbank-Marke, und Sie nicht angeben, dass in Ihrer Frage.
Deklarieren Sie eine lokale Tabelle var und setzen die Werte in die es, legen Sie Sie in Ihre inaktive Tabelle, dann löschen Sie die Zeilen der aktiven Tabelle werden in Ihrer lokalen Liste.
Die Transaktion Idee genauso gut funktioniert aber auch.
Entweder eine eindeutige id-Spalte wie
oder
Auch, vergessen Sie nicht, wickeln Sie diesen Prozess in einer Transaktion.
Glück.
Dies ist, wie ich die Erhaltung meiner where-Klauseln:
Wenn Sie brauchen, stärker als dieser, werden Sie brauchen, zu betrachten, locking (sperren von änderungen während der Transaktion).
Warum hast du zwei Tabellen, anstatt eine Spalte für "IsActive"?