![SQL Server Autonumber 或 @@identy 或其他](https://linux22.com/image/655679/SQL%20Server%20Autonumber%20%E6%88%96%20%40%40identy%20%E6%88%96%E5%85%B6%E4%BB%96.png)
突然间,一个旧系统又回到了我的手中,让我回想起 6 年前的情形。
该系统可从 3 个不同的办公室访问,因此,这些办公室的每个用户都应按顺序获得下一个号码,以便开展工作。
我依稀记得,最好使用主题行中的一个或另一个来获取唯一的引用,因为用户都可以发出请求,并且都可以得到相同的引用,但只有其中一个会存储他们的记录信息,即使两个外部应用程序都会说他们有正确的详细信息和引用
这会让任何人想起什么吗?
答案1
INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 将包含该语句生成的最后一个标识值。如果该语句未影响任何具有标识列的表,则 @@IDENTITY 将返回 NULL。如果插入了多行并生成了多个标识值,则 @@IDENTITY 将返回生成的最后一个标识值。如果该语句触发了一个或多个执行生成标识值的插入的触发器,则在语句之后立即调用 @@IDENTITY 将返回触发器生成的最后一个标识值。如果在具有标识列的表上执行插入操作后触发了触发器,并且该触发器插入到另一个没有标识列的表中,则 @@IDENTITY 将返回第一个插入的标识值。如果 INSERT 或 SELECT INTO 语句或大容量复制失败,或者事务回滚,则 @@IDENTITY 值不会恢复为以前的设置。
(从这里)
“自动编号”是 Microsoft Access 的功能。SQL Server 的对应功能是
CREATE TABLE Example
(
id_num int IDENTITY(1,1) PRIMARY KEY,
othercolumn varchar (20)
)
对于较新版本的 SQL Server(2012 及更高版本),您还可以使用顺序。
CREATE SEQUENCE ExampleSequence
AS BIGINT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 99999
NO CYCLE
CACHE 10;
CREATE TABLE dbo.Example
(ExampleId INT NOT NULL,
AnotherColumn VARCHAR(10))
GO
ALTER TABLE dbo.Example
ADD DEFAULT NEXT VALUE FOR dbo.ExampleSequence FOR ExampleId
GO
长话短说,我认为你在谈论两件不同的事情。
答案2
这是 SQL 2000 的信息
嗨,Katherine,谢谢你的回复。我很欣赏你对两个不同项目(自动编号 - 访问和身份)的看法。我尝试(但失败了)在不使用“身份”一词的情况下区分这两个不同的项目。
基本上,此数据库的 SP 首先插入数据,然后调用 @@identity。我的问题是,两个不同办公室的两个用户分别针对各自的记录获得了相同的序列。
最后终于找到了它,上面的摘录对我集中追踪确实很有帮助。
仅供参考。当 SP 首次被调用时,第一条记录被写入数据库,在它有机会调用 @@identity 之前,其他办公室会进行一些其他插入,并将 Identity 列作为罪证,因此当它最终执行时(所有办公室都一样),最新的写入是返回的 Identity。
值得庆幸的是,所有数据都是安全的,只是标识符出了问题。我们有其他进程可以捕获它,这些进程刚刚启动并引起了我们的注意。
现在开始创建一个缺陷,看看他们需要多长时间来修复它:)