如何将序列号从一个表转移到另一个表?

时间:2015-07-14 15:30:52

标签: sql-server-2008 tsql

我想创建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

4 个答案:

答案 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