【问题标题】:How can I insert into from one table to another with autoincrement in SQL Server如何在 SQL Server 中使用自动增量从一个表插入到另一个表
【发布时间】:2022-01-21 04:31:56
【问题描述】:

如果我在 SQL Server 中有这两个表:

            Table 1       ||          Table 2
--------------------------||----------------------------
    Number    |    Name   ||     Number    |    Name
--------------|-----------|| --------------|------------
      1       |     B     ||       1       |      A   
      2       |     C     ||               |    

我想要做的是将表 1 中的条目插入表 2,但我希望表 2 自动增加数字。所以我希望它变成这样:

           Table 2        ||
--------------------------||
    Number    |    Name   ||
--------------|-----------||
      1       |     A     ||
      2       |     B     ||
      3       |     C     ||

我尝试过这样的查询,但没有成功:

Insert into table2 (Number, Name)
    select 
        (select max(number) + 1 from table1), Name 
    from table1

也许你会建议在 table2 主键中设置数字,但我想像上面的查询一样使用最大数字。

提前致谢。

【问题讨论】:

  • [Table 2].[Number] 声明为IDENTITY。它不需要是主键。

标签: sql sql-server insert


【解决方案1】:

这可能有点过于简单,也许您正在寻找更复杂的东西,但是...

INSERT INTO Table2 (Number, Name)
SELECT
   T.Number + X.MaxRowNumber
  ,T.Name
FROM Table1 T
INNER JOIN (SELECT MAX(Number) AS MaxRowNumber FROM Table2) X
  ON 1 = 1
;

此方法基于您的陈述:

也许你会建议在 table2 主键中设置数字,但我 想像上面的查询那样使用最大数量。

据我了解,您不想将 Table2.Number 设置为 IDENTITY 列,而是在 INSERT 操作期间执行自动增量。

我倾向于同意其他答案,即 Table2.Number 应该是 IDENTITY 列,因此无需计算即可自动递增,但如果这不是您想要的,那么这个答案应该对您有所帮助。

您可以使用带有真实数据的表变量对此进行测试,以确保它是您正在寻找的:

DECLARE @TABLE1 AS TABLE (Number INT, Name CHAR(1));
DECLARE @TABLE2 AS TABLE (Number INT, Name CHAR(1));
INSERT INTO @TABLE1 (Number, Name) VALUES ('1','B'), ('2','C');
INSERT INTO @TABLE2 (Number, Name) VALUES ('1','A');

INSERT INTO @TABLE2 (Number, Name)
SELECT
   T.Number + X.MaxRowNumber
  ,T.Name
FROM @TABLE1 T
CROSS APPLY (SELECT MAX(Number) AS MaxRowNumber FROM @TABLE2) X
;

SELECT * FROM @TABLE2
;

【讨论】:

    【解决方案2】:

    Table2.Number 应该是IDENTITY。然后,您可以在表 2 中插入表 1 中的名称。

    create table table2(number int not null identity(1,1), name char(1));
    insert into table2 values ('A');
    insert into table2 select name from table1;
    

    Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2020-03-31
      • 2015-07-02
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多