给定这个带有复合主键的简单表
注意:没有列是自动增量标识 - 所有编号都是手动
Note2 :此问题的上下文是编写要在构建时应用的更新脚本,而不是运行时。它将静态条目插入到有序项列表中。
我发现以下查询成功重新编号选择的一组行(想法是为插入腾出空间,同时将id2保持为有序序列)。
update t
set id2 = id2 + 1
where id1 = 2 and id2 > 1
在执行上述查询的某个时刻,实际上存在主键冲突,但它不会导致我的测试失败,这些测试使用 SQL Server 2012 。
这使我相信在所有更新之后检查主键约束。
这是从DBMS到DBMS的不同之处还是由于SQL语句的跨国性质而给定的?
答案 0 :(得分:1)
实际上,在查询执行期间没有PK违规。它的工作原理如下(简化):
如果您的陈述会破坏约束,则会在步骤3中检测到。
您可以阅读有关逻辑查询处理的更多信息。规则是相同的,不依赖于DBMS,但物理实现不同。
答案 1 :(得分:0)
PK自动增量字段保证在列中是唯一的,但不一定是连续的。
然而,对于您自己计算的任何PK的唯一性,绝对没有任何保证。
如果您需要数字PK,只需设置Identity属性并让服务器完成它的工作。
重新编号行将是一个非常糟糕的主意,除非数据库处于单用户模式。其他任何东西只是在乞求麻烦,实际上考虑到数据库缓存的方式,即使你是唯一的用户,我也不相信它是可靠的。