我想将条目移动到有序列表的中间,其中订单由唯一列“orderby”维护。当将值移动到列表的中间时,我指定orderby值,如果已经取值,那么旧行的orderby应该递增或递减1,具体取决于移动的方向。
出于测试目的,我有这张表:
CREATE TABLE test(
orderby integer,
UNIQUE(orderby) )
我目前有以下触发器:
CREATE TRIGGER [test_insert]
BEFORE UPDATE OF [orderby]
ON [test]
FOR EACH ROW
BEGIN
UPDATE test
SET orderby = orderby + 1
WHERE NEW.orderby = orderby;
END
但是,这仅在触发器创建的orderby值未使用时才有效。
即如果我运行UPDATE test SET orderby = 2 WHERE orderby = 1
,它将使用具有orderby值{1; 2},但没有一个值为{1的表; 2; 3}
我该如何解决这个问题?或者也许完全不同?
编辑:如果我不能让它工作,我想我总是可以选择在一个范围内递增所有orderby-s,但是,我仍然想让它工作,这将允许我使用价值或订单,并获得更高的效率。
答案 0 :(得分:0)
编辑:现在已经澄清了愿望,取代原来的答案。
您无法将字段定义为唯一字段,因为即使BEFORE触发器在唯一性违规后触发也会触发。因此,使用更安全的AFTER。
以下是我想要的代码,然后是一些测试更新。
CREATE TABLE test(pk char primary key,
orderby integer);
CREATE TRIGGER test_insert
AFTER UPDATE OF orderby ON test
BEGIN
UPDATE test
set orderby = orderby + 1
where test.orderby >= NEW.orderby
and test.pk != NEW.pk;
END;
insert into test (pk, orderby) values ("a", 1);
insert into test (pk, orderby) values ("b", 2);
insert into test (pk, orderby) values ("c", 3);
select * from test;
update test set orderby=1 where pk='c';
select * from test order by orderby";
update test set orderby=2 where pk='b';
select * from test order by orderby;
update test set orderby=4 where pk='a';
select * from test order by orderby;