我正在尝试找出 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。
最佳答案
这可能对您有用。让我知道。
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
关于sql-server - TSQL 触发器维护增量订单完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39236662/