【问题标题】:Check to see if a row or an ID already exist before doing a mass insert on a table在对表执行批量插入之前检查行或 ID 是否已经存在
【发布时间】:2020-12-29 05:50:21
【问题描述】:

我正在尝试像这样从一个数据库表插入另一个数据库表:

INSERT INTO factoryDB_Development.dbo.engineList
    SELECT * 
    FROM factoryDB_Staging.dbo.engineList 
    WHERE engineID NOT IN (SELECT engineID 
                           FROM factoryDB_Development.dbo.engineList)

但我收到此错误:

无法在对象“dbo.engineList”中插入重复键

我认为这是因为 factoryDB_Development.dbo.engineList 中已经存在该 ID。

当我在微软网站上查看时,我刚刚看到了这个:

To work around this issue, enable trace flag 8690 to disable the Spool operation

有没有办法在插入之前检查行或 ID 是否已经存在?

谢谢!

【问题讨论】:

  • 由于您正在验证目标表中不存在 engineID,我猜您从原始表中获取了重复项,因此出现了错误。
  • @iceblade 谢谢!我想我明白你的意思....有没有办法只插入原始表中的一个重复项?就像原来的 'engineList' 表有 3 行的一个 engineID,我可以插入第一个吗?
  • 当然,您可以从源表中仅选择不同的引擎 ID,然后从同一个表中使用前 1 进行交叉应用以获取其他列。这样,您将消除重复项。您可以提供数据示例,以便我们帮助您进行查询。
  • 如果您确定所有重复的行都是相同的,您可以只选择不同的,这将选择并插入每个 engineID 仅 1 行
  • 是的,如果行相同,您可以这样做:Select distinct * From factoryDB_Staging.dbo.engineList

标签: tsql sql-server-2012


【解决方案1】:

如果我正确理解了您的问题,您希望避免在目标表中插入具有相同 ID 的记录的记录。

如果有问题的 ID 列是主键,您可以通过重新创建索引来简单地设置 IGNORE_DUP_KEY = ON。

下面是示例。

CREATE TABLE [dbo].[Source](
    [ID] [int] NULL,
    [Name] [varchar](5) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Target](
    [ID] [int] NOT NULL,
    [Name] [varchar](5) NULL,
PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

--input sample values in source
INSERT INTO [Source] VALUES (1, 'A') , (1, 'A') , (2, 'B')

--insert data from source to target
INSERT INTO Target 
SELECT  * FROM Source

DROP TABLE SOURCE
DROP TABLE TARGET

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2011-11-21
    • 2021-08-18
    相关资源
    最近更新 更多