【发布时间】:2011-06-18 17:02:29
【问题描述】:
我正在处理 SQL Server 中的一个表,该表具有一个 serial_no 列,该列被定义为非 null int。它似乎不是一个自动递增字段,就好像我将该列从插入语句中删除一样,我收到一条错误消息,指出 serial_no 字段不能为空。
那么如何插入下一个可用的数字?
我试过了:
INSERT INTO mytable (serial_no) VALUES ( (SELECT MAX(serial_no)+1 FROM mytable))
但我收到一条错误消息,提示不能在此上下文中使用子查询。
编辑:此表用于现成产品,因此我无法更改设计并使 serial_no 列自动递增。
【问题讨论】:
-
它必须在所有行中都是唯一的吗?答案中推荐的方法通常不是并发安全的,例如您最终可能会出现重复......您要么需要 a) 将其设为
INT IDENTITY列并让 SQL Server 担心它,b) 比 obviuosSELECT MAX(serial_no)+1做更多的工作,或者 c) 等待对于 SQL Server 2011 并使用它的概念SEQUENCES -
marc_s,我完全同意,但不幸的是我无法更改数据库设计。如果我锁定表,插入然后解锁怎么办?这会保护它免受欺骗吗?还是等待中的查询只是等待锁释放然后插入重复的#?
-
您能否运行跟踪以确定第 3 方应用程序如何创造价值并做同样的事情?我会说,如果没有标识列,他们可能会使用表来保存下一个值。已经有一个答案提到了这种技术。
标签: sql sql-server insert auto-increment