首页 > 解决方案 > 仅当某些列不重复时才插入 SQL Server 表

问题描述

我有一个这样的 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中的一个列表。

列表 = [['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)

标签: sqlsql-serversubquerysql-insertbulkinsert

解决方案


如果我正确地跟随你,你可以使用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
)

推荐阅读