【问题标题】:Insert into SQL Server table only if some columns are not duplicate仅当某些列不重复时才插入 SQL Server 表
【发布时间】:2020-09-03 07:52:47
【问题描述】:

我有一个这样的 SQL Server 表:

CREATE TABLE [dbo].[Person]
(
    [ID] [uniqueidentifier] NOT NULL,
    [name] [uniqueidentifier] NOT NULL,
    [address] [nvarchar](50) NULL,
    [value] [nvarchar](max) NULL
    [date] [datetime] NOT NULL,

    CONSTRAINT [PK_Person] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
)

它有如下数据:

ID  name   address  value    date
-----------------------------------------------------
1   a      1         10      2020-08-27 06:06:29.833
2   b      2         30      2020-08-28 06:06:29.833
3   c      3         5       2020-08-27 06:06:29.833
4   d      4         30      2020-08-28 06:06:29.833

我正在对该表进行批量插入。插入时,如果数据为(名称、地址、值)重复,我不想插入。我想静默插入数据。

所以如果要插入的输入数据是:

ID  name   address  value    date
-----------------------------------------------------
5   e      5         10      2020-08-27 06:06:29.833
6   b      2         30      2020-08-29 06:06:29.833
7   c      3         5       2020-08-30 06:06:29.833
8   f      4         30      2020-08-28 06:06:29.833

那么只有 ID 为 5 和 8 的行被插入,ID 为 6 和 7 的行被认为是重复的,不应作为新的插入,并且在最终表中(名称、地址、值)始终是唯一的。

我的坏。输入数据不是来自表。 它是python中的一个列表。

list = [['e', 5, 10], ['b', 2,30], ['c', 3, 5], ['f', 4,30]]

目前我的查询是:

insert_query = "INSERT INTO Person(ID,name,address,value,date) VALUES ( newID(),%s, %s, %s,getDate());"
cursor.executemany(insert_query, list)

我想要类似的东西:

insert_query = "INSERT INTO Person(ID,name,address,value,date) VALUES ( newID(),%s, %s, %s,getDate()) on duplicate(name,address,value) ignore that insert;"
cursor.executemany(insert_query, list)

【问题讨论】:

  • 请告诉我们您的insert 代码。
  • 你试过了吗?检查任何其他 SO 问题,搜索答案?这是一个非常常见的问题,可以通过自联接或 EXISTS 子句轻松解决。本周我注意到至少一个类似的问题
  • " 在最终表(名称、地址、值)中始终是唯一的。"那么我要做的第一件事就是在这些列上创建一个唯一约束(或索引),甚至在我处理插入之前。
  • 但这会引发错误。我想静默插入其他数据不重复的新行

标签: sql sql-server subquery sql-insert bulkinsert


【解决方案1】:

如果我没听错,你可以使用not exists

insert into person (name, address, value, date)
select x.*
from (values (@name, @address, @value, @date)) as x(name, address, value, date)
where not exists (
    select 1
    from person p1
    where p1.name = p.name and p1.address = p.address and p1.value = p.value
)

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 2013-04-28
    • 1970-01-01
    • 2012-06-20
    • 2022-11-18
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多