SQLite级联增量,保持唯一性(对于有序列表)

时间:2013-01-03 21:39:08

标签: sqlite

我想将条目移动到有序列表的中间,其中订单由唯一列“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,但是,我仍然想让它工作,这将允许我使用价值或订单,并获得更高的效率。

1 个答案:

答案 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;