如何为特定列分配唯一的自动递增值?有点像AUTO_INCREMENT一样,但是在插入时应该为NULL,并在以后分配。
我有一个表,该表可获取常规数据插入,还有一些用于处理数据并在完成后设置processed_at
日期时间字段的工作人员。现在,我要自上次调用以来逐步选择新处理的行。如果我天真地使用where processed_at > @last_update_time
,恐怕可能会发生某些记录在同一秒被处理而我错过一些行的情况。
更新:我可以做
begin;
select @max := max(foo) from table1;
update table1 set foo = @max + 1 where id = 'bar' limit 1;
commit;
如果foo
列已建立索引?
答案 0 :(得分:0)
您可以使用触发器来实现。
use QAST; # It does not exist
my $this-qast = QAST::Load("some-external-file.p6") # Would want something like this
但是请记住,此触发器将在Update查询的每次执行中起作用。
您也可以手动进行操作:
创建表以存储增量值:
CREATE TABLE my_increment (value INT, table_name TEXT);
INSERT INTO my_increment VALUES (0, 'your_table_name');
CREATE TRIGGER pk AFTER UPDATE ON your_table_name
BEGIN
UPDATE my_increment
SET value = value + 1
WHERE table_name = 'your_table_name';
UPDATE your_table_name
SET ID2 = (
SELECT value
FROM my_increment
WHERE table_name = 'your_table_name')
WHERE ROWID = new.ROWID;
END;
然后,当您要更新表时,从该表中获取最后一个值,并将value + 1插入需要增加的列中。