Ich bin mir nicht sicher, ob ich verstehe, warum dies für Ihr Szenario nicht funktioniert. Ist TIMESTAMP
garantiert eindeutig in MS SQL Server?
Aha – ich sehe in SQL Server timestamp ist ein Synonym für rowversion was so etwas wie AUTO_INCREMENT
von MySQL ist außer es erzeugt einen neuen monoton ansteigenden Wert bei UPDATE
sowie auf INSERT
.
Nein, MySQL hat so etwas nicht. MySQL unterstützt auch keine SEQUENCE
Objekt wie Oracle oder PostgreSQL oder IBM DB2. Eine Sequenz würde es Ihnen beispielsweise ermöglichen, einen neuen Wert aus einem Trigger zu generieren.
Ich habe Ihre aktualisierten Informationen in Ihrer Frage gelesen und verstehe daher das Problem, das Sie zu lösen versuchen.
Was ich als alternative Lösung gesehen habe, ist das Hinzufügen eines weiteren Attributs in die Tabelle, die Sie verarbeiten, nennen Sie es is_processed
oder so. Geben Sie NULL ein, wenn Sie eine neue Zeile einfügen. Wenn Sie zur Verarbeitung kommen, ändern Sie den Wert in dieser Spalte auf 1. Dann wissen Sie immer, welche Zeilen Sie noch verarbeiten müssen – das sind die Zeilen, in denen is_processed IS NULL
ist .
Zu Ihrem Kommentar:Okay, ich sehe das Problem. Jeder Benutzer benötigt seine eigene Ansicht, welche Zeilen neu/geändert wurden.
Ein weiterer Hack, den ich in MySQL gesehen habe, um ein Sequenzobjekt zu simulieren, ist eine Tabelle, die einen Auto-Increment-Primärschlüssel und sonst nichts enthält. Sie können neue eindeutige monoton ansteigende Werte generieren, indem Sie in diese Tabelle einfügen und die Einfügung dann rückgängig machen.
CREATE TABLE sequence (id SERIAL) ENGINE=InnoDB; -- Must be InnoDB
START TRANSACTION;
INSERT INTO sequence () VALUES (); -- Yes this is a legal statement.
ROLLBACK;
SELECT LAST_INSERT_ID();
Sie können innerhalb eines MySQL-Triggers keine Transaktionen starten und rückgängig machen, daher müssen Sie die neuen Werte in Ihrem Anwendungscode generieren.
Oder Sie könnten zu PostgreSQL wechseln und echte Unterstützung für Sequenzen erhalten.