关于 IDENTITY 的问题,以前没人问过,很难。

shclhs 2006-05-18 08:27:19
现在我想让两张表使用同一个IDENTITY, 请问这个怎么实现。

注明:请不要说,创建一个 公共表 去专门产生一个IDENTITY 为这两张表。
...全文
419 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoqun_ncs 2006-05-19
  • 打赏
  • 举报
回复
顶一下楼上,存在就是合理。哈哈

回来,godfather_wang的方法有一个问题,如果你不是把事务设置为串行读,那么会出现千奇百怪的错误,例如select @maxid1 =max(id) from t1之后被另外一个事务插入一条记录了,到你insert的时候就dupl pk了。

trigger的方法如果你不要求id是连续的话那个应该是可以的(我不是很确定)。如果你说的id是员工工号那么我建议你不要用工号做id,因为id(自增长)不一定是连续的
shclhs 2006-05-19
  • 打赏
  • 举报
回复
TO lzhs(快乐至上)

呵呵,先不要讨论合不合理,既然提出来了就是合理的。况且我只是举个例子说是部门员工。


好像只能是 godfather_wang 得方法了。
lzhs 2006-05-19
  • 打赏
  • 举报
回复
楼主,你这样的实现我觉得不太合理。
为什么两个部门的员工要分在两张表里呢?
在员工表里加个部门字段不就可以解决了吗?
godfather_wang 2006-05-19
  • 打赏
  • 举报
回复

declare @maxid1 varchar(20)
declare @maxid2 varchar(20)
declare @maxid varchar(20)
select @maxid1 =max(id) from t1
select @maxid2 =max(id) from t2
if (@maxid1>maxid2) then
@maxid=@maxid1+1
else

@maxid=@maxid2+1

select @maxid
昵称被占用了 2006-05-19
  • 打赏
  • 举报
回复
还是用paoluo(一天到晚游泳的鱼)的结构,用存储过程实现插入

create proc insertT1T2
@Name1 varchar(10),
@Name2 varchar(10)
as

insert T1(name) values(@Name1)
insert T2(id,name) select SCOPE_IDENTITY(),@name2

go

greatqn 2006-05-19
  • 打赏
  • 举报
回复
做个计数的表,里面有一行记录这个id的最大值。每次有插入数据时,就个值就加1。

不要设IDENTITY。

我以前的一个项目里就是有张表用来记所有的表的ID值。这张表的结构就是:
表名,ID值
hgamezoom 2006-05-19
  • 打赏
  • 举报
回复
用存储过程实现,插入的时候先读2张表里最大的值,然后加1,同时要注意在插入时候要对2张表都加锁,避免同步问题。
shclhs 2006-05-19
  • 打赏
  • 举报
回复
並發确实需要考虑,但现在好像没有太多的办法, 期盼大家给出更好的答案,也希望MS 能以后改进一下,学习学习orcal 呵呵。
lzhs 2006-05-19
  • 打赏
  • 举报
回复
declare @maxid1 varchar(20)
declare @maxid2 varchar(20)
declare @maxid varchar(20)
select @maxid1 =max(id) from t1
select @maxid2 =max(id) from t2
if (@maxid1>maxid2) then
@maxid=@maxid1+1
else
@maxid=@maxid2+1

可以在这个的基础上修改一下,对于@maxid,可以在后面再加一个N位的随机数?


paoluo 2006-05-19
  • 打赏
  • 举报
回复
如果說godfather_wang() 的做法可以滿足你的要求的話,可以這麼寫。

Declare @maxid Int
Select @maxid=IsNull(Max(ID),0)+1 From
(Select ID From T1
Union All
Select ID From T2)A
Select @maxid


不過你要考慮並發的問題
shclhs 2006-05-19
  • 打赏
  • 举报
回复
我不要求 ID 是连续的。只要能用这个字段来唯一标示 这条记录(对两个表来说)就可以了
lzhs 2006-05-19
  • 打赏
  • 举报
回复
。。。
明白,思考中。
liangpei2008 2006-05-18
  • 打赏
  • 举报
回复
??还是不懂!
最终效果:
两表ID始终保持一致 ?
shclhs 2006-05-18
  • 打赏
  • 举报
回复
好像不行啊,
我现在是想这样
T1 T2
ID, name ID, name
1 111 2 abc
3 333 5 abc
4 ddd 7 ggg
8 mmm 9 uuu
....

就是说这两张表仅仅是共享同一个Identity, 对于插入,修改,删除,两个表并不相互影响。
liangpei2008 2006-05-18
  • 打赏
  • 举报
回复
刚才打错了,不太好实现
liangpei2008 2006-05-18
  • 打赏
  • 举报
回复
明白,利用触发器实现表ID同步!paoluo(一天到晚游泳的鱼)的做法是可以的!
shclhs 2006-05-18
  • 打赏
  • 举报
回复
To liangpei2008(我爱世界杯) ( ) 信誉:100

liangpei2008 2006-05-18
  • 打赏
  • 举报
回复
两张表使用同一个IDENTITY??
如果先向t2插数据,t1是不是也要同步t2的ID?
shclhs 2006-05-18
  • 打赏
  • 举报
回复
是这样的,我有两张表,这两张表里放的是类似的东西,但是他们不能放在同一张表里。但是他们又被要求有同一个ID.

譬如:一个公司,两个部门: department,对部门里的员工给工号,这两个部门的员工信息放在两张表里department1 department2.
paoluo 2006-05-18
  • 打赏
  • 举报
回复
--建立測試環境
Create Table T1(ID Int Identity(1,1),Name Varchar(10))
Create Table T2(ID Int ,[Desc] Varchar(10))
GO
--建立觸發器
Create Trigger Insert_T2 On T1
For Insert
As
Insert T2(ID) Select ID From Inserted
GO
Create Trigger Delete_T2 On T1
For Delete
As
Delete A From T2 A Inner Join Deleted B On A.ID=B.ID
GO
--測試
Insert T1 Select 'aa'
Union All Select 'bb'
Union All Select 'cc'

Delete From T1 Where ID=3

Insert T1 Select 'dd'

Select * From T1
Select * From T2
GO
--刪除測試環境
Drop Table T1,T2
GO
--結果
/*
ID Name
1 aa
2 bb
4 dd

ID Desc
1 NULL
2 NULL
4 NULL
*/


這樣是否滿足要求??
加载更多回复(5)

34,587

社区成员

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

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