2016-08-30 36 views
2

我想在SQL Server数据库中找出触发器。我是一名暑期项目的学生,所以我不是专业人士,但可以轻松学习。TSQL触发器来保持增量订单的完整性

这是我的数据库表的简化版本排序按等级:

ID作为主键

ID | RANK 
-------------- 
2 | NULL 
1 | 1 
3 | 2 
4 | 3 
7 | 4 

我的目标现在是要插入的能力/删除/更新等级并保持数据库中等级的增量顺序,而没有缺少可用职位中的数字并且没有重复。

/* Insert new row */ 

INSERT INTO TABLE (ID, RANK) VALUES (6, 4) 

/* AFTER INSERT */ 

ID | RANK 
-------------- 
2 | NULL 
1 | 1 
3 | 2 
4 | 3 
6 | 4 <- new 
7 | 5 <- notice how the rank increased to make room for the new row 

我认为在触发器中这样做是最有效/最简单的方法;虽然我可能是错的。

除了触发器,我做了一个临时解决方案,当任何等级改变时,我使用前端代码在每一行上运行更新。

如果你知道如何或如果触发器可以做到这一点,请分享。

编辑:添加方案 被插入的等级将始终采用其分配的编号。所有大于或等于被插入的东西都会增加。

引起触发的排名将始终优先声明其编号,而其他所有排名都会增加以适应排名。

如果rank是最高数字,那么触发器将确保该数字是最大值的+1。

+0

这会增加。 ID恰好是为了?如果插入是(2,5)会怎么样? – Paparazzi

+1

这会影响你桌子的表现。 –

+0

尝试使RANK列成为计算列 –

回答

0

这可能适合你。让我知道。

DROP TABLE dbo.test 

CREATE TABLE dbo.test (id int, ranke int) 

INSERT INTO test VALUES (2, NULL) 
INSERT INTO test VALUES (1, 1) 
INSERT INTO test VALUES (3, 2) 
INSERT INTO test VALUES (4, 3) 
INSERT INTO test VALUES (7, 4) 

GO 

CREATE TRIGGER t_test 
ON test 
AFTER INSERT 
AS 
UPDATE test set ranke += 1 WHERE ranke >= (select max(ranke) from inserted) and id <> (select max(id) from inserted) 

GO 

INSERT INTO test values (6,4) 
INSERT INTO test values (12,NULL) 

SELECT * FROM test 
+1

我不认为这将妥善处理'插入'中有多行的情况。 – Blorgbeard

+0

不,绝对不会插入多行。您可以在触发器中编写一个游标:O –

+1

您不需要游标(性能不佳)来处理触发器中的多个记录。例如,您可以创建一个数据集,并将ROW_NUMBER函数添加到以前的MAX ID中,并且可以一次性插入它们。并不是说我认为手动输入等级的整个概念是有道理的,但请不要使用游标。 – btberry