【问题标题】:Insert records from one table on another table incrementing id将一个表中的记录插入到另一个表中,递增 id
【发布时间】:2019-12-12 22:56:10
【问题描述】:

如何将一个表(table1)中的记录插入到不同 SQL 数据库中的同一个表(table2)中?

但是目标表已经存在并且具有相同 id(c1) 的记录。 table1的记录必须添加到table2,但是我必须增加字段(c1)。

表 1

C1;C2;C3;
1;Name 1;Address 1;
2;Name 2;Address 2;
3;Name 3;Address 3;
4;Name 4;Address 4;

表 2

C1;C2;C3 ;
1;Name 11;Address 11;
2;Name 12;Address 12;
3;Name 13;Address 13;
4;Name 14;Address 14;
5;Name 1;Address 1;
6;Name 2;Address 2;
7;Name 3;Address 3;
8;Name 4;Address 4;

怎么了? 两个数据库中的表 cl 和以下列相同: (clstamp, nome, no, estab, vendnm, ncont)

INSERT INTO DB2..cl(clstamp, nome, estab, vendnm, ncont)
    select clstamp, nome, estab, vendnm, ncont
      FROM         [DB1]..[cl]
      LEFT JOIN    [DB2]..[cl] ON [DB1]..[cl].clstamp=[DB2]..[cl].clstamp 
      and [DB1]..[cl].nome=[DB2]..[cl].nome 
      and [DB1]..[cl].estab=[DB2]..[cl].estab 
      and [DB1]..[cl].vendm=[DB2]..[cl].vendnm 
      and [DB1]..[cl].ncont=[DB2]..[cl].ncont
    where [DB1]..cl.ncont not in (select ncont from [DB2]..cl) 
    order by [DB2]..[cl].no

【问题讨论】:

  • 尝试导出向导。右键单击数据库 > 任务 > 导出数据
  • table2 是否有 C1 的标识列?另外,它们在同一台服务器上吗?
  • 是的,c1 是一个标识列,它们在同一个服务器中
  • 如果你想在table2中保留对table1中原始记录的引用,那么你可以在table2中添加一个额外的字段。 F.e.命名为“table1ID”。但是话又说回来,这将违背normalization 的精神。
  • 不,我不需要对 table1 的引用。我只需要扫描 c1 列中的最后一个数字并将 +1 增加到该列。

标签: sql sql-server


【解决方案1】:

如果您的数据库在同一台服务器上,并且表 2 的 C1 列标记为标识列,那么您通常可以执行简单的 SQL 语句:

INSERT INTO database2..table2(C2, C3)
SELECT C2, C3
FROM database1..table1
ORDER BY C1 ASC

【讨论】:

  • 这行不通。身份可以而且将会有差距。当服务器重新启动时,它们会跳跃 10,000 左右。任何被删除的行也会产生间隙。除非他们当然不在乎他们是否可以将这些行绑在一起。如果是这种情况,那么这很好。
  • 对不起,我的错误。 c1 列不是标识,只是主键。违反主键约束“pk_cl”。无法在对象中插入重复键...
【解决方案2】:

如果你想避免插入重复的行,请试试这个:

INSERT INTO database2..myTable2 (C2, C3)
        select t1.c2, t1.c3
          FROM         [database1]..[table1] t1
          LEFT JOIN    [database2]..[table2] t2 ON t1.C2 = t2.C2 and t1.C3 = t2.C3
        where t2.c2 is null and t2.c3 is null
        order by t1.C1

如果你对重复没问题,那么 Angelo 已经提到了解决方案。

我尝试使用临时表,工作代码如下:

IF (OBJECT_ID('tempdb..#myTable1') IS NOT NULL)
BEGIN
   DROP TABLE #myTable1
END;

IF (OBJECT_ID('tempdb..#myTable2') IS NOT NULL)
BEGIN
   DROP TABLE #myTable2
END;

CREATE TABLE #myTable1 ([C1] int identity(1,1), [C2]  varchar(10),  [C3]  varchar(10));

CREATE TABLE #myTable2 ([C1] int identity(1,1), [C2]  varchar(10),  [C3]  varchar(10));

Insert INTO #myTable1(C2, C3)
values
 ('Name 1', 'Address 1')
, ('Name 2', 'Address 2')
, ('Name 3', 'Address 3')
, ('Name 4', 'Address 4')

Insert INTO #myTable2(C2, C3)
values
  ('Name 11', 'Address 11')
, ('Name 12', 'Address 12')
, ('Name 13', 'Address 13')
, ('Name 14', 'Address 14')

select * from #myTable1
select * from #myTable2

INSERT INTO #myTable2 (C2, C3)
    select t1.c2, t1.c3
      FROM         [#myTable1] t1
      LEFT JOIN    [#myTable2] t2 ON t1.C2 = t2.C2 and t1.C3 = t2.C3
    where t2.c2 is null and t2.c3 is null
    order by t1.C1

select * from #myTable2

【讨论】:

    【解决方案3】:

    如果你没有手动添加IDENTITY_INSERT这样的设置,那么所有插入的记录自然会被授予增量ID。

    正如您所描述的,您遇到的问题是 重复记录违反了您的 PRIMARY KEY 约束

    最直接的方法是使用MERGE 语句。 MERGE INTO 表 2 USING 表 1。 WHEN MATCHED什么都不做,当UNMATCHED时插入记录

    另外,请注意,如果您DELETE 任何记录,则已删除的 ID 不会为新插入的行回收。因此,如果您希望原始 ID 和插入的 ID 连续流动,请检查表格

    【讨论】:

    • 合并语句怎么做?只添加,不更新或删除。
    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多