关于主键获取自增值?(100分+100%结贴)

敦厚的曹操 2012-07-25 10:49:43
下面这个例子可以使No字段在插入时,自动得到Id自增的值,但是把NO设为主键,插入时就会出错,插入第一条不会出错,插入第二条就会出错。
我的要求就是想用Id为自增,而NO为主键(为了保证不重复,且可以修改)取ID的值作为默认值。


create table aaa
( Id int identity(1,1),
No int default(isnull(scope_identity(),0)+1),
Name varchar(20)
)

insert into aaa(Name) values('a')

select * from aaa

/*
Id No Name
----------- ----------- --------------------
1 1 a

(1 row(s) affected)
*/



...全文
238 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
敦厚的曹操 2012-07-27
  • 打赏
  • 举报
回复
还是大版主发言,够权威,解决了,21楼的方法很给力,太谢谢各位了,一下把问题给弄透彻了!马上结贴,给分!
icebbb34 2012-07-26
  • 打赏
  • 举报
回复
create table bbbl11
( Id int identity(1,1),
No int default(IDENT_CURRENT('dbo.bbbl11')) PRIMARY KEY,
Name varchar(20))


insert into bbbl11(Name) values('a')
insert into bbbl11(Name) values('a')

select * from dbo.bbbl11
icebbb34 2012-07-26
  • 打赏
  • 举报
回复
create table bbbl11
( Id int identity(1,1),
No int default(IDENT_CURRENT('dbo.bbbl11')) PRIMARY KEY,
Name varchar(20))


insert into bbbl11(Name) values('a')
insert into bbbl11(Name) values('a')

select * from dbo.bbbl11
wu5224311 2012-07-26
  • 打赏
  • 举报
回复
不知道····看看后面有没有高手··
中国风 2012-07-26
  • 打赏
  • 举报
回复
用计算列实现方法


create table bbbl11
( Id int identity(1,1),
No AS ID+1 PERSISTED PRIMARY KEY,
Name varchar(20)
)


insert into bbbl11(Name) values('a')
insert into bbbl11(Name) values('a')

select * from dbo.bbbl11
中国风 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

楼上各位,除了【magician547】,其他的都没看明白我的意思。
一、Id为自增
二、NO为主键(为了保证“不重复”,且"可以修改")取ID的值作为默认值


大家可以试试下面这段代码:
SQL code

create table bbb
( Id int identity(1,1),
No int default(isnull(scope_identity(),0)……
[/Quote]

用21楼方法: IDENT_CURRENT( 'table_name' )
返回为指定的表或视图生成的最后一个标识值。所生成的最后一个标识值可以针对任何会话和任何作用域。
中国风 2012-07-26
  • 打赏
  • 举报
回复
NO设置为主健,如果只是用于实现可用计算列,然后在计算列建索引提高效率

用触发器实现方法
参照
http://blog.csdn.net/roy_88/article/details/1424370
敦厚的曹操 2012-07-25
  • 打赏
  • 举报
回复
select scope_identity()
得到的是Null,为什么是Null,难道不是ID自增的最大值吗?
敦厚的曹操 2012-07-25
  • 打赏
  • 举报
回复
我用下面的命令,竟然得到的总是1,怎么会这样?不是取最大值吗?

select isnull(scope_identity(),0)+1
敦厚的曹操 2012-07-25
  • 打赏
  • 举报
回复
楼上的谢谢,
关键是[NO为主键(为了保证“不重复”,且"可以修改")取ID的值作为默认值要求,下面的语句满足不了,]
rno as id primary key,--- 不能修改
AcHerat 元老 2012-07-25
  • 打赏
  • 举报
回复
關鍵在於 isnull(scope_identity(),0) 這裡,第一次插入的時候沒有自增值那麼按 0 來計算,退出管理器,登錄重新執行的時候 也是 沒有自增值的,那麼重新按 0 來計數,這肯定有問題,難道 1 3 樓不能解決問題麼?
敦厚的曹操 2012-07-25
  • 打赏
  • 举报
回复
哪位高手能按楼上我给的代码,试试,看能不能帮我解决,是什么问题?
真心的感谢!
敦厚的曹操 2012-07-25
  • 打赏
  • 举报
回复
楼上各位,除了【magician547】,其他的都没看明白我的意思。
一、Id为自增
二、NO为主键(为了保证“不重复”,且"可以修改")取ID的值作为默认值


大家可以试试下面这段代码:

create table bbb
( Id int identity(1,1),
No int default(isnull(scope_identity(),0)+1) PRIMARY KEY,
Name varchar(20)

insert into bbb(Name) values('a')
insert into bbb(Name) values('a')
select * from bbb



******************************************
1、在查询中执行没有问题。
2、关键是问题出在这里,按我说的做:退出ssms(管理器),然后重新登陆服务器,再执行insert就不能了,提示主键不能重复。
孤独加百列 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
下面这个例子可以使No字段在插入时,自动得到Id自增的值,但是把NO设为主键,插入时就会出错,插入第一条不会出错,插入第二条就会出错。
我的要求就是想用Id为自增,而NO为主键(为了保证不重复,且可以修改)取ID的值作为默认值。
SQL code


create table aaa
( Id int identity(1,1),
No int default(isnull(scope_……
[/Quote]
你出错是因为scope_identity计数的问题。你把表删除重新登录数据库就可以,创建后就没有问题了。你重新创建表后scope_identity不是从1开始计数的,而id列是从1开始增长的。新创建表后先取一次scope_identity的值刷新下就可以了。
Felixzhaowenzhong 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code

create table aaa
( Id int identity(1,1),
rno as id,
Name varchar(20)
)

insert into aaa(Name) values('a')
insert into aaa(Name) values('a')
insert into aaa(Name) values('a')

……
[/Quote]

加强一下 小三的
create table aaa
( Id int identity(1,1),
rno as id primary key,
Name varchar(20)
)

insert into aaa(Name) values('a')
insert into aaa(Name) values('a')
insert into aaa(Name) values('a')

select * from aaa
孤独加百列 2012-07-25
  • 打赏
  • 举报
回复
No列改为NOT NULL就可以了

create table aaa
( Id int identity(1,1),
No int default(isnull(scope_identity(),0)+1),
Name varchar(20)
)

主键列不能为可以NULL,必须NOT NULL
AcHerat 元老 2012-07-25
  • 打赏
  • 举报
回复

create table aaa
( Id int identity(1,1),
rno as id,
Name varchar(20)
)

insert into aaa(Name) values('a')
insert into aaa(Name) values('a')
insert into aaa(Name) values('a')

select * from aaa

drop table aaa
敦厚的曹操 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

SQL code

先创建表
CREATE TABLE ttt (
id int IDENTITY (1, 1) NOT NULL ,
noid int primary key NOT NULL
)

添加一个触发器,
CREATE TRIGGER tri_insert ON ttt
after INSERT
AS
begin
update ttt set no……
[/Quote]

这种方法我试过,但试如果关联外键,就插入不了了,提示出错!
以学习为目的 2012-07-25
  • 打赏
  • 举报
回复
SCOPE_IDENTITY 只返回插入到当前作用域中的值
以学习为目的 2012-07-25
  • 打赏
  • 举报
回复
SCOPE_IDENTITY 只返回插入到当前作用域中的值
加载更多回复(6)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧