有关SQL自动递增字段值错误的问题 可以用@@identity取得当前的标识值可以用dbcc checkdient 重置标识的起始值 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以用@@identity取得当前的标识值可以用dbcc checkident 重置标识的起始值 递增字段从新开始记数的情况 TRUNCATE TABLE tablename 后就会这样 或者是去掉了自增的列,后来又添加,造成数据不唯一如何查看SQL的当前递增值是多少,如何修改这个递增值identity(int,1,1) 这个就是表示从1开始以1来递增。identity(int,1,2) 这个就是表示从1开始以2来递增。identity(int,1,1) --在生成表的脚本是可以看到。 SQL SERVER 2000 中的标识值获取函数 选择自 zjcxc 的 Blog 关键字 SQL SERVER 2000 中的标识值获取函数 出处 SQL SERVER 2000 中的标识值获取函数 IDENTITY(标识)列,也有很多人称之为自增列,在SQL Server 2000中,标识列通过IDENTITY来定义,下面是与获取最后插入记录的标识值有关的函数的一个示例说明 SQL Server 中,可以使用 SCOPE_IDENTITY()、 @@IDENTITY 、 IDENT_CURRENT() 来取得最后插入记录的值值,它们的区别在于:SCOPE_IDENTITY() 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。@@IDENTITY 返回在当前会话的所有表中生成的最后一个标识值IDENT_CURRENT() 返回为任何会话和任何作用域中的指定表最后生成的标识值下面以一个示例来说明它们的区别 -- a) 示例代码 -- ===========================================-- 创建测试表-- ===========================================USE tempdbGOCREATE TABLE t1(id int IDENTITY,col int)INSERT t1 SELECT 1UNION ALL SELECT 2CREATE TABLE t2(id int IDENTITY,col int)GOCREATE TRIGGER TR_insert_t2 ON t2FOR INSERTAS INSERT t1 SELECT 3GO -- ===========================================-- 测试三个函数..1-- ===========================================INSERT t2 VALUES(1)SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')/*--结果SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2 ------------------ ------------ -------------------------- -----------------------1 3 3 1(所影响的行数为 1 行)--*/GO-- ===========================================-- 测试三个函数..2-- ===========================================INSERT t1 VALUES(10)SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')/*--结果SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2 ------------------ ------------ -------------------------- -----------------------4 4 4 1(所影响的行数为 1 行)--*/GO-- ===========================================-- 测试三个函数..3-- ** 开启一个新连接,执行下面的代码 **-- ===========================================SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')/*--结果SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2 ------------------ ------------ -------------------------- -----------------------NULL NULL 4 &n --===========================================-- 删除测试环境-- ===========================================DROP TABLE t1,t2 -- b) 代码结果说明 从上面的代码可以看到:IDENT_CURRENT() 始终返回指定表最后插入的标识值@@IDENTITY 返回当前会话的标识值,无论是否在同一个作用域,在测试1、2中,可以看到它返回的是触发器中插入记录的标识值,而在测试3中,因为当前会话无插入记录,所以返回NULLSCOPE_IDENTITY() 返回当前会话同一作用域的标识值,所以在测试1、2中,它返回的值不受触发器的影响,而在测试3中,因为当前会话无插入记录,所以返回NULL truncate,delete,drop的异同点说明:本文摘自oracle技术用户讨论组truncate,delete,drop的异同点 注意:这里说的delete是指不带where子句的delete语句 相同点:truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态. 2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger. 3.delete语句不影响表所占用的extent, 高水线(high water)保持原位置不动 显然drop语句将表所占用的空间全部释放 truncate 语句缺省情况下将空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始). 4.速度,一般来说: drop> truncate > delete 5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及 使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大. 想删除表,当然用drop 想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete. 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据 征集有点深度的MSSQL DBA面试题 请教一个关于SQL的问题。 mssql 存储过程拼接条件 =======数据库连接不上啊,一定不是代码问题====================== 触发器问题 SQl 存储过程中包函变量 问一个数据复制问题 开发专家系统问题? 也是模糊查询的问题 在SQL SERVER 中如何把库“挂起”及“加入”, 请详细点。 . 哪位大虾能不能告诉我一下怎么样将一个数据库自动备份的.bat文件还原? 请问数据库高手,如何备份一个表
@@identity取得当前的标识值
可以用
dbcc checkident 重置标识的起始值
或者是去掉了自增的列,后来又添加,造成数据不唯一
如何查看SQL的当前递增值是多少,如何修改这个递增值identity(int,1,1) 这个就是表示从1开始以1来递增。
identity(int,1,2) 这个就是表示从1开始以2来递增。
identity(int,1,1) --在生成表的脚本是可以看到。
关键字 SQL SERVER 2000 中的标识值获取函数
出处
SQL SERVER 2000 中的标识值获取函数
IDENTITY(标识)列,也有很多人称之为自增列,在SQL Server 2000中,标识列通过IDENTITY来定义,下面是与获取最后插入记录的标识值有关的函数的一个示例说明 SQL Server 中,可以使用 SCOPE_IDENTITY()、 @@IDENTITY 、 IDENT_CURRENT() 来取得最后插入记录的值值,它们的区别在于:
SCOPE_IDENTITY() 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。
@@IDENTITY 返回在当前会话的所有表中生成的最后一个标识值
IDENT_CURRENT() 返回为任何会话和任何作用域中的指定表最后生成的标识值
下面以一个示例来说明它们的区别 -- a) 示例代码
-- ===========================================
-- 创建测试表
-- ===========================================
USE tempdb
GOCREATE TABLE t1(id int IDENTITY,col int)
INSERT t1 SELECT 1
UNION ALL SELECT 2
CREATE TABLE t2(id int IDENTITY,col int)
GOCREATE TRIGGER TR_insert_t2 ON t2
FOR INSERT
AS
INSERT t1 SELECT 3
GO -- ===========================================
-- 测试三个函数..1
-- ===========================================
INSERT t2 VALUES(1)
SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
[@@IDENTITY]=@@IDENTITY,
[IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),
[IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')/*--结果
SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2
------------------ ------------ -------------------------- -----------------------
1 3 3 1(所影响的行数为 1 行)
--*/
GO-- ===========================================
-- 测试三个函数..2
-- ===========================================
INSERT t1 VALUES(10)
SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
[@@IDENTITY]=@@IDENTITY,
[IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),
[IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')/*--结果
SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2
------------------ ------------ -------------------------- -----------------------
4 4 4 1(所影响的行数为 1 行)
--*/
GO-- ===========================================
-- 测试三个函数..3
-- ** 开启一个新连接,执行下面的代码 **
-- ===========================================
SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
[@@IDENTITY]=@@IDENTITY,
[IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),
[IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')/*--结果
SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2
------------------ ------------ -------------------------- -----------------------
NULL NULL 4 &n --===========================================
-- 删除测试环境
-- ===========================================
DROP TABLE t1,t2 -- b) 代码结果说明
从上面的代码可以看到:
IDENT_CURRENT() 始终返回指定表最后插入的标识值
@@IDENTITY 返回当前会话的标识值,无论是否在同一个作用域,在测试1、2中,可以看到它返回的是触发器中插入记录的标识值,而在测试3中,因为当前会话无插入记录,所以返回NULL
SCOPE_IDENTITY() 返回当前会话同一作用域的标识值,所以在测试1、2中,它返回的值不受触发器的影响,而在测试3中,因为当前会话无插入记录,所以返回NULL
注意:这里说的delete是指不带where子句的delete语句
相同点:truncate和不带where子句的delete, 以及drop都会删除表内的数据
不同点:
1. truncate和 delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
3.delete语句不影响表所占用的extent, 高水线(high water)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate 语句缺省情况下将空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).
4.速度,一般来说: drop> truncate > delete
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据