Não sei se entendi por que isso não funciona para o seu cenário. É
TIMESTAMP
garantido para ser exclusivo no MS SQL Server? Aha -- vejo no SQL Server timestamp é sinônimo de rowversion que é como o
AUTO_INCREMENT
do MySQL exceto que gera um novo valor monotonicamente crescente em UPDATE
bem como em INSERT
. Não, o MySQL não tem nada assim. Nem o MySQL suporta uma
SEQUENCE
objeto como Oracle ou PostgreSQL ou IBM DB2. Uma sequência permitiria que você gerasse um novo valor a partir de um gatilho, por exemplo. Li suas informações atualizadas em sua pergunta, então entendo o problema que você está tentando resolver.
O que eu vi como uma solução alternativa é adicionar outro atributo na tabela que você está processando, chame-o de
is_processed
ou alguma coisa. Insira um NULL ao inserir uma nova linha. Quando você começar a processá-lo, altere o valor dessa coluna para 1. Assim, você sempre saberá quais linhas ainda precisa processar -- elas serão as linhas em que is_processed IS NULL
. Re seu comentário:Ok, eu vejo o problema. Cada usuário precisa de sua própria visualização de quais linhas são novas/alteradas.
Outro hack que vi usado no MySQL para simular um objeto de sequência é uma tabela que contém uma chave primária de incremento automático e nada mais. Você pode gerar novos valores únicos crescentes monotonicamente inserindo nesta tabela e, em seguida, reverter a inserção.
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();
Você não pode iniciar e reverter transações em um gatilho MySQL, então você terá que gerar os novos valores no código do seu aplicativo.
Ou então você pode mudar para o PostgreSQL e obter suporte real para sequências.