TSQL触发器以维护增量订单完整性

时间:2016-08-30 20:36:12

标签: sql-server database tsql triggers sql-server-2012

我试图弄清楚SQL Server数据库中的触发器。我是一名从事夏季项目的学生,所以我不是这方面的专家,但可以很容易地学习它。

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

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

我认为在触发器中执行此操作是最有效/最简单的方法;虽然我可能错了。

除了触发器之外,我还制作了一个临时解决方案,使用前端代码在任何排名发生变化时在每一行上运行更新。

如果您知道触发器如何或者是否可以执行此操作,请分享。

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

导致触发的排名将始终优先声明其数字,而其他所有排名都会增加以适应。

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

1 个答案:

答案 0 :(得分: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