sql - 仅当某些列不重复时才插入 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)
解决方案
如果我正确地跟随你,你可以使用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
)
推荐阅读
- android - 无法解析支持片段和运行时
- python-3.x - 为什么我无法启动张量板
- asp.net - 本地页面对象的 ASPX 缓存?
- elasticsearch - 使用 curl 迁移 elasticsearch 映射
- alexa - Alexa YESNO 意图
- python-3.x - python3 nltk, WordNetLemmatizer 出现错误
- wordpress - Wordpress 临时站点的身份验证
- python - 如果另一列中的字符串包含列表中的内容,则更新一列中的值
- html-email - mc:可重复的背景颜色 mailchimp
- javascript - JavaScript:为特定的 div id 检查了限制复选框