我想创建2个表,我想为两个表创建一个通用的序列ID。两个表中不应重复Sequnce ID。我正在尝试使用Identity创建,但我不知道如何将表1中的最大id转移到表2。
我正在使用MS SQL server 2008。
我希望这两个表类似于下面,
表1:
Seq_ID value1 value2
1 x y
2 a b
表2:
Seq_ID value1 value2
3 i j
4 k l
答案 0 :(得分:0)
对于单个身份,不能在表之间使用身份。
"将表1中的最大id转移到表2。"这会让我相信你认为表1中的数据永远不会改变,因为表2的身份从最大表1开始?
如果您知道数据永远不会改变,那么只需设置表1中的数据,并在表2中设置一个标识,其中起始值为表1 + 1中的maxId
-- create table1
-- insert data into table1
declare @maxId int
select @maxId = max(id) + 1
from table1
create table table2 (id int primary key identity(@maxId,1)
另一种选择是在表之间错开ID,这样就永远不会重叠:
create table table1 (id int primary key identity(1,2))
create table table2 (id int primary key identity(2,2))
table1
将始终具有奇数ID,table2
将始终具有偶数。但是,在此方法中,table2
的ID不一定大于table1
的最大ID。
编辑:如果您需要table1
ID始终大于table2
,您也可以这样做:
create table table1 (id int primary key identity(0,-1))
create table table2 (id int primary key identity(1,1))
table1
将从0开始向后(0,-1,-2),table2
将从1开始向上(1,2,3)。
答案 1 :(得分:0)
sequence object不适合你吗?我认为这是最好的解决方案,你需要尝试一下。
问候!
答案 2 :(得分:0)
如果没有SEQUENCE ,您可以" hack"它有一个带有标识列的Sequence表。但这意味着你必须插入两个表。首先插入"序列"用于获取新id的表,然后在子表中使用该值。
其他选项是创建函数GetMaxId值并添加1.但是,执行此操作时要小心。在您执行此操作时,您需要锁定表以防止并发访问。可能希望在执行其余逻辑之前插入带有新id的占位符记录,以最小化锁定持续时间。
第一种选择更好。更好的是,升级到SQL SERVER 2012!
实际上,我不知道这是否适合你,但还有更多选择。制作表1 ID identity (1,1)
和其他identity(-1,-1)
你可以尝试一下..
CREATE TABLE #x (id INT IDENTITY(1,1), b BIT)
CREATE TABLE #y (id INT IDENTITY(-1,-1), b BIT)
INSERT INTO #x VALUES (1),(1),(1)
INSERT INTO #y VALUES (1),(1),(1)
SELECT * FROM #x
SELECT * FROM #y
我不认为我必须提到这不是一个可扩展的解决方案。
答案 3 :(得分:0)
两个相同的表,具有相同的列名和相同的数据类型,需要共享一个标识符,就像数据设计问题一样。
但你可以只有一张桌子
表:
Seq_ID TableID value1 value2
1 1 x y
2 1 a b
3 2 i j
4 2 k l