sql-server - TSQL 触发器维护增量订单完整性

标签 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。

最佳答案

这可能对您有用。让我知道。

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/

相关文章:

sql-server - SQL Server Management Studio : Import quietly ignoring 99. 9% 的数据

java - 实现搜索功能 - 以字符串作为参数和通配符 % 的 eclipselink SQL

sql-server - 存储大型数值多维数组的最佳方式

mysql - 有没有办法从下往上搜索 mySQL 行并根据参数更改结果?

c#数据库选择然后插入。但是值为0

sql-server - 确定不能在事务中执行的 T-SQL/DDL

c# - 将天数添加到 DateTime 返回值为 0?

c# - 为什么 C# 代码不从存储过程返回值

sql - 如何递归查找 child 的所有ID?

sql - 如何根据日期和类型分组