Nejsem si jistý, jestli rozumím tomu, proč to ve vašem scénáři nefunguje. Je TIMESTAMP
zaručeno, že bude jedinečný v MS SQL Server?
Aha – v SQL Serveru vidím, že časové razítko je synonymem pro rowversion což je něco jako AUTO_INCREMENT
MySQL kromě toho generuje novou monotónně rostoucí hodnotu na UPDATE
a také na INSERT
.
Ne, MySQL nic takového nemá. MySQL také nepodporuje SEQUENCE
objekt jako Oracle nebo PostgreSQL nebo IBM DB2. Sekvence by vám například umožnila vygenerovat novou hodnotu ze spouštěče.
Četl jsem vaše aktualizované informace ve vaší otázce, takže rozumím problému, který se snažíte vyřešit.
Co jsem viděl jako alternativní řešení, je přidat další atribut do tabulky, kterou zpracováváte, nazvěte jej is_processed
nebo něco. Při vkládání nového řádku zadejte NULL. Když se dostanete ke zpracování, změňte hodnotu v tomto sloupci na 1. Pak budete vždy vědět, které řádky musíte ještě zpracovat – budou to řádky, kde is_processed IS NULL
.
K vašemu komentáři:Dobře, vidím problém. Každý uživatel potřebuje svůj vlastní pohled na to, které řádky jsou nové/změněné.
Další hack, který jsem v MySQL použil k simulaci sekvenčního objektu, je tabulka, která obsahuje primární klíč s automatickým přírůstkem a nic jiného. Můžete vygenerovat nové jedinečné monotónně rostoucí hodnoty vložením do této tabulky a poté vrátit vložení zpět.
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();
V rámci spouštěče MySQL nemůžete spustit a vrátit transakce, takže nové hodnoty budete muset vygenerovat v kódu aplikace.
Nebo můžete přejít na PostgreSQL a získat skutečnou podporu pro sekvence.