Не съм сигурен, че разбирам защо това не работи за вашия сценарий. Е TIMESTAMP
гарантирано, че е уникален в MS SQL Server?
Аха, виждам, че времевата марка на SQL Server е синоним на rowversion което е нещо като AUTO_INCREMENT
на MySQL освен че генерира нова монотонно нарастваща стойност при UPDATE
както и на INSERT
.
Не, MySQL няма нищо подобно. MySQL също не поддържа SEQUENCE
обект като Oracle или PostgreSQL или IBM DB2. Последователност ще ви позволи да генерирате нова стойност от тригер, например.
Прочетох актуализираната ви информация във вашия въпрос, така че разбирам проблема, който се опитвате да разрешите.
Това, което видях като алтернативно решение, е да добавите друг атрибут в таблицата, която обработвате, да го наречете is_processed
или нещо. Въведете NULL, когато вмъквате нов ред. Когато стигнете до обработката, променете стойността в тази колона на 1. Тогава винаги ще знаете кои редове все още трябва да обработите – те ще бъдат редовете, където is_processed IS NULL
.
Относно вашия коментар:Добре, виждам проблема. Всеки потребител има нужда от собствен изглед за това кои редове са нови/променени.
Друг хак, който съм виждал използван в MySQL за симулиране на обект на последователност, е таблица, която съдържа първичен ключ за автоматично увеличаване и нищо друго. Можете да генерирате нови уникални монотонно нарастващи стойности, като вмъкнете в тази таблица и след това върнете вмъкването назад.
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();
Не можете да стартирате и връщате транзакции в рамките на MySQL тригер, така че ще трябва да генерирате новите стойности в кода на приложението си.
В противен случай можете да преминете към PostgreSQL и да получите реална поддръжка за последователности.