0

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

4

1 回答 1

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;
于 2013-01-04T01:01:56.780 回答