日期:2014-05-18  浏览次数:20621 次

关于主键获取自增值?(100分+100%结贴)
下面这个例子可以使No字段在插入时,自动得到Id自增的值,但是把NO设为主键,插入时就会出错,插入第一条不会出错,插入第二条就会出错。
我的要求就是想用Id为自增,而NO为主键(为了保证不重复,且可以修改)取ID的值作为默认值。
SQL code


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)
*/






------解决方案--------------------
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')

select * from aaa

drop table aaa

------解决方案--------------------
No列改为NOT NULL就可以了
SQL code

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

------解决方案--------------------
探讨
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')

……

------解决方案--------------------
探讨
下面这个例子可以使No字段在插入时,自动得到Id自增的值,但是把NO设为主键,插入时就会出错,插入第一条不会出错,插入第二条就会出错。
我的要求就是想用Id为自增,而NO为主键(为了保证不重复,且可以修改)取ID的值作为默认值。
SQL code


create table aaa
( Id int identity(1,1),
No int default(isnull(scope_……

------解决方案--------------------
關鍵在於 isnull(scope_identity(),0) 這裡,第一次插入的時候沒有自增值那麼按 0 來計算,退出管理器,登錄重新執行的時候 也是 沒有自增值的,那麼重新按 0 來計數,這肯定有問題,難道 1 3 樓不能解決問題麼?
------解决方案--------------------
你登錄到SQL管理器,隨意新建一個查詢窗口 select scope_identity() 看就知道了。

對於你最新的插入語句,其 scope_identity() 就相當於在新窗口查詢到的。
------解决方案--------------------
樓主你可以採用自增列做主鍵,同時可以自己加一個流水號來控制,更改的時候去更新流水號,自增列不要變動,類似:

1 DTS2012072501
2 DTS2012072502

更新後邊的流水號。
------解决方案--------------------
直接实现没办法,其实在No字段上建唯一索引即可,
这样就保证"不重复",且"可以修改"了.如下代码,
SQL code

create table bbb
( Id int identity(1,1) primary key,
  No int default(isnull(scope_identity(),0)+1) unique,
  Name varchar(20)
)

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

select * from bbb

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

(2 row(s) affected)
*/

------解决方案--------------------
No int default(isnull(scope_identity(),0)+1)
我电脑上试这种没有什么效果,是乱的,一会2,一会4,一会3。
测试因为是连续的,所以看不出来。
还是用小三的 no int as id 这个不错。
------解决方案--------------------
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 noid=inserted.id from inserted  where ttt.id=inserted.id
end

在插入数据后将id的值赋给noid列(插入数据默认给noid的值为0,规避主键不能为空),这样就可以了
并且支持update noid列

样例
 insert into ttt(noid) values(0);
select id,noid  from ttt
1    1
2    2
4    4
5    5

------解决方案--------------------