生成下一个主键值

时间:2018-12-17 22:03:40

标签: sql sql-server tsql

假设我有两个桌子。 第一张桌子就是这样

ID      Code
NULL    106164029
NULL    106100797
NULL    106100793
NULL    106301098
NULL    106010735
NULL    206010989
NULL    206010956

现在第二张桌子是这样的...

ID  Code
1   102323223
2   105454545
3   106232244
4   106432432
5   106043222
6   206122222
7   211111116

在将它们合并在一起后,如何使表生成下一个ID(主键)值,使表看起来像这样?

ID    Code
1     102323223
2     105454545
3     106232244
4     106432432
5     106043222
6     206122222
7     211111116
8     106164029
9     106100797
10    106100793
11    106301098
12    106010735
13    206010989
14    206010956

2 个答案:

答案 0 :(得分:3)

您可以为您的PK字段使用IDENTITY属性,并且可以保留第一个表的顺序,并为第二个表赋予随机顺序。

您还可以为ID为NULL的表指定顺序,但是您必须为conditional order by选择该顺序,因为该表没有基于您的逻辑顺序已经提供了。

create table #t1 (id int null, code bigint)
create table #t2 (id int null, code bigint)

insert into #t1
values
(NULL,106164029),
(NULL,106100797),
(NULL,106100793),
(NULL,106301098),
(NULL,106010735),
(NULL,206010989),
(NULL,206010956)

insert into #t2
values
(1,102323223),
(2,105454545),
(3,106232244),
(4,106432432),
(5,106043222),
(6,206122222),
(7,211111116)

--here is your final table with the auto calculated id primary key
create table #t3 (id int identity (1,1), code bigint)
alter table #t3 add constraint pk primary key (id)

--the order by keeps the same order as the original table with the id values
insert into #t3
select code from #t2
order by id

--since the ID is null in this table, i didn't specify an order by but you could using conditional order by
insert into #t3
select code from #t1


--see the results
select * from #t3 order by id

drop table #t1, #t2, #t3

这将返回以下内容,其中包含您对第一个表(1-7)的顺序,但对第二个表没有保证的顺序,除非您应用某种逻辑来指定该表的顺序。事实是,没有办法说出来。单个聚集索引可能会有所帮助。

+----+-----------+
| id |   code    |
+----+-----------+
|  1 | 102323223 |
|  2 | 105454545 |
|  3 | 106232244 |
|  4 | 106432432 |
|  5 | 106043222 |
|  6 | 206122222 |
|  7 | 211111116 |
|  8 | 106164029 |
|  9 | 106100797 |
| 10 | 106100793 |
| 11 | 106301098 |
| 12 | 106010735 |
| 13 | 206010989 |
| 14 | 206010956 |
+----+-----------+

答案 1 :(得分:0)

您有三种方法。

第一种(简单)方式:定义一个标识字段,以便在执行INSERT语句时填充它。

第二种方式:编写INSERT语句时,可以应用逻辑来计算ID,如下所示:

INSERT INTO yourtable (id, code)
SELECT ISNULL((SELECT COUNT(*) FROM yourtable t2
       WHERE t2.code < @code), 0), code

第三种方式:在UPDATE之后应用INSERT语句。

INSERT INTO yourtable (code) VALUES (yourcode)

,在所有INSERT语句之后,您可以编写如下:

UPDATE yourtable SET id = 
    ISNULL((SELECT COUNT(*) FROM yourtable t2
    WHERE t2.code < yourtable.code), 0)
WHERE id IS NULL