DuckDB:精通Insert语句处理数据冲突

本文介绍DuckDB insert语句用法,包括常规的批量插入,尤其是插入数据冲突的处理,最后还提及returning子句的用法,每个用法提供示例说明。

insert插入数据

INSERT INTO向表中插入新行。可以插入由值表达式指定的一行或多行,也可以插入由查询产生的零行或多行。

## 批量插入
INSERT INTO tblVALUES (1), (2), (3);
## 从查询插入
INSERT INTO tblSELECT * FROM other_tbl;
## 包括缺省值
INSERT INTO tbl (i)VALUES (1), (DEFAULT), (3);

数据冲突处理

ON CONFLICT子句可用于对UNIQUE或PRIMARY KEY约束产生的冲突执行特定操作。下面的例子展示了这种冲突的一个例子:
在这里插入图片描述

CREATE TABLE tbl (i INTEGER PRIMARY KEY, j INTEGER);
INSERT INTO tblVALUES (1, 42);
INSERT INTO tblVALUES (1, 84);

结果仅(1,42)成功插入,并抛出错误:

Constraint Error: Duplicate key "i: 1" violates primary key constraint.

DO NOTHING Clause

DO NOTHING子句会忽略错误,并且不插入或更新值。例如:

CREATE TABLE tbl (i INTEGER PRIMARY KEY, j INTEGER);
INSERT INTO tblVALUES (1, 42);
INSERT INTO tblVALUES (1, 84)ON CONFLICT DO NOTHING;

这些语句成功完成,并留下行数据<i: 1, j: 42>在表中。

INSERT OR IGNORE INTO

插入或忽略到…语句是INSERT INTO…的一种更短的语法替代方案。对冲突什么都不做。例如,以下语句是等价的:

INSERT OR IGNORE INTO tblVALUES (1, 84);
INSERT INTO tblVALUES (1, 84) ON CONFLICT DO NOTHING;

DO UPDATE Clause (Upsert)

DO UPDATE子句会导致INSERT转换为冲突行上的UPDATE。后面的set表达式决定如何更新这些行。表达式可以使用特殊的虚拟表EXCLUDED,其中包含该行的冲突值。你还可以提供附加的WHERE子句,该子句可以从更新中排除某些行。不满足此条件的冲突将被忽略。

因为我们需要一种方法来引用要插入的元组和现有的元组,所以我们引入了特殊的exclude限定符。如果提供了EXCLUDED限定符,则引用指向要插入的元组,否则引用指向现有的元组。这个特殊的限定符可以在ON CONFLICT子句的where子句和SET表达式中使用。请看示例:

CREATE TABLE tbl (i INTEGER PRIMARY KEY, j INTEGER);
INSERT INTO tblVALUES (1, 42);
INSERT INTO tblVALUES (1, 84)ON CONFLICT DO UPDATE SET j = EXCLUDED.j;
SELECT * FROM tbl;

输出结果:

i	j
1	84

重新排列列和使用BY NAME也是可能的,请看下面示例:

CREATE TABLE tbl (i INTEGER PRIMARY KEY, j INTEGER);
INSERT INTO tblVALUES (1, 42);
INSERT INTO tbl (j, i)VALUES (168, 1)ON CONFLICT DO UPDATE SET j = EXCLUDED.j;
INSERT INTO tblBY NAME (SELECT 1 AS i, 336 AS j)ON CONFLICT DO UPDATE SET j = EXCLUDED.j;
SELECT * FROM tbl;

输出结果:

i	j
1	336

INSERT OR REPLACE INTO

插入或替换到…语句是INSERT INTO…的一种更短的语法替代方案。DO UPDATE SET c1 = EXCLUDED。c1, c2 = EXCLUDED。c2,……也就是说,它将现有行的每一列更新为要插入行的新值。例如,给定以下输入表:

CREATE TABLE tbl (i INTEGER PRIMARY KEY, j INTEGER);
INSERT INTO tblVALUES (1, 42);# 下面这些语句是等价的
INSERT OR REPLACE INTO tblVALUES (1, 84);
INSERT INTO tblVALUES (1, 84)ON CONFLICT DO UPDATE SET j = EXCLUDED.j;
INSERT INTO tbl (j, i)VALUES (84, 1)ON CONFLICT DO UPDATE SET j = EXCLUDED.j;
INSERT INTO tbl BY NAME(SELECT 84 AS j, 1 AS i)ON CONFLICT DO UPDATE SET j = EXCLUDED.j; 

RETURNING Clause

RETURNING子句可用于返回插入的行的内容。如果某些列是在插入时计算的,这可能很有用。例如,如果表包含一个自动递增的主键,那么RETURNING子句将包含自动创建的主键。这在生成列的情况下也很有用。

可以显式选择要返回的部分或所有列,并且可以选择使用别名重命名它们。也可以返回任意的非聚合表达式,而不是简单地返回一列。可以使用*表达式返回所有列,并且除了*返回的所有列之外,还可以返回列或表达式。

下面返回42,举例:

CREATE TABLE t1 (i INTEGER);
INSERT INTO t1SELECT 42RETURNING *;

返回结果:

 i
42

一个更复杂的例子,在RETURNING子句中包含一个表达式:

CREATE TABLE t2 (i INTEGER, j INTEGER); 
INSERT INTO t2    
SELECT 2 AS i, 3 AS j    
RETURNING *, i * j AS i_times_j;

返回:

i	j	i_times_j
2	3	6

下一个示例展示了return子句更有用的情况。首先,用一个主键列创建一个表。然后创建一个序列,允许在插入新行时增加主键。当我们插入到表中时,我们还不知道序列生成的值,因此返回它们是有价值的。

CREATE TABLE t3 (i INTEGER PRIMARY KEY, j INTEGER);
CREATE SEQUENCE 't3_key';
INSERT INTO t3SELECT nextval('t3_key') AS i, 42 AS jUNION ALLSELECT nextval('t3_key') AS i, 43 AS jRETURNING *;

返回结果:

i	j
1	42
2	43

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)

inode 和 block 的映射 该博文中有详细解释&#xff1a;【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题&#xff1a; 问题一&#xff1a; 我们访问文件&#xff0c;都是用的文件名&#xff0c;没用过 inode 号啊&#xff1f; 之前总是说可以通过一个…

SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用

SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用 文章目录 SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用一. 使用SpringBoot自带的定时任务&#xff08;适用于小型应用&#xff09;二. 使用调度框架…

flutter 使用google_mlkit_image_labeling做图片识别

在AI横行的如今&#xff0c;相信大家或多或少都做过跟AI接轨的需求了吧&#xff1f;今天我说的是关于图片识别的需求&#xff0c;flutter的专属图片识别插件google_mlkit_image_labeling。 google_mlkit_image_labeling它是Google旗下的Google Cloud Vision API中分支出来的一部…

国产编辑器EverEdit - 合并行

1 合并行 1.1 应用场景 在编写代码或其他场景下&#xff0c;有时需要把多行的内容缩减成一行&#xff0c;或者纯粹减少行数进行合并&#xff0c;比如&#xff1a;下面的字典的定义&#xff0c;每个元素占了一行&#xff0c;有点浪费&#xff0c;现在需要把它们缩减行数。 typ…

3 前端(中):JavaScript

文章目录 前言&#xff1a;JavaScript简介一、ECMAscript&#xff08;JavaScript基本语法&#xff09;1 JavaScript与html结合方式&#xff08;快速入门&#xff09;2 基本知识&#xff08;1&#xff09;JavaScript注释&#xff08;和Java注释一样&#xff09;&#xff08;2&am…

RIME-CNN-LSTM-Attention多变量多步时序预测Matlab实现

SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…

一文读懂服务器的HBA卡

什么是 HBA 卡 HBA 卡&#xff0c;全称主机总线适配器&#xff08;Host Bus Adapter&#xff09; &#xff0c;是服务器与存储装置间的关键纽带&#xff0c;承担着输入 / 输出&#xff08;I/O&#xff09;处理及物理连接的重任。作为一种电路板或集成电路适配器&#xff0c;HBA…

mfc操作json示例

首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…

综述:大语言模型在机器人导航中的最新进展!

简介 机器人导航是指机器人能够在环境中自主移动和定位的能力。本文系统地回顾了基于大语言模型&#xff08;LLMs&#xff09;的机器人导航研究&#xff0c;将其分为感知、规划、控制、交互和协调等方面。具体来说&#xff0c;机器人导航通常被视为一个几何映射和规划问题&…

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…

Vscode:问题解决办法 及 Tips 总结

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个功能强大的开源代码编辑器&#xff0c;广泛用于各种编程语言和开发场景&#xff0c;本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法&#xff0c;使用过程中的技巧 文章目录 扩展安装失败调试配…

Linux(NFS服务)

赛题拓扑&#xff1a; 题目&#xff1a; NFS&#xff1a; 共享/webdata/目录。用于存储AppSrv主机的WEB数据。仅允许AppSrv主机访问该共享。 [rootstoragesrv ~]# yum install nfs-utils -y [rootstoragesrv ~]# mkdir /webdata [rootstoragesrv ~]# chmod -R ow /webdata …

c.p.api.config.MyAuthenticationProvider

文章目录 1、URL1、AdminController3、AuthenticationProvider 2025-01-15 14:21:31.017 WARN 1972 --- [nio-8087-exec-8] c.p.api.config.MyAuthenticationProvider : 管理员:13524972741 登录失败:密码错误解释: 时间戳: 2025-01-15 14:21:31.017 - 表示日志记录的时间…

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

设置 Git 默认推送不需要输入账号和密码【Ubuntu、SSH】

如何设置 Git 默认推送不需要输入账号和密码 在使用 Git 管理代码时&#xff0c;许多开发者会遇到每次推送&#xff08;push&#xff09;或拉取&#xff08;fetch&#xff09;代码时都需要输入 GitHub 或 GitLab 等远程仓库的账号和密码的情况。虽然设置了用户名和电子邮件信息…

【ArcGIS微课1000例】0140:总览(鹰眼)、放大镜、查看器的用法

文章目录 一、总览工具二、放大镜工具三、查看器工具ArcGIS中提供了三种局部查看的工具: 总览(鹰眼)、放大镜、查看器,如下图所示,本文讲述这三种工具的使用方法。 一、总览工具 为了便于效果查看与比对,本实验采用全球影像数据(位于配套实验数据包中的0140.rar中),加…

Vue3数据响应式原理

什么是数据响应式 当数据变化时&#xff0c;引用数据的函数&#xff08;副作用函数&#xff09;自动重新执行。 即数据触发了函数的响应&#xff0c;如&#xff1a;视图渲染中使用了某数据&#xff0c;数据改变后&#xff0c;视图跟着自动更新。 触发者&#xff1a;数据 响应者…

机器学习06-正则化

机器学习06-正则化 文章目录 机器学习06-正则化0-核心逻辑脉络1-参考网址3-大模型训练中的正则化1.正则化的定义与作用2.常见的正则化方法及其应用场景2.1 L1正则化&#xff08;Lasso&#xff09;2.2 L2正则化&#xff08;Ridge&#xff09;2.3 弹性网络正则化&#xff08;Elas…

springboot学生成绩管理系统

Spring Boot学生成绩管理系统是一个基于Spring Boot框架开发的&#xff0c;旨在帮助教育机构、学校或教师高效管理学生成绩的系统。 一、系统背景与意义 在教育领域&#xff0c;学生成绩的管理是一项重要且繁琐的工作。传统的手工管理方式不仅效率低下&#xff0c;还容易出错…

13软考高项,项目资源管理

团队章程&#xff1a;价值观&#xff0c;沟通指南&#xff0c;决策标准和过程&#xff0c;冲突处理过程&#xff0c;会议指南和团队共识&#xff01; 资源管理计划&#xff1a;识别资源&#xff0c;获取资源&#xff0c;角色&#xff0c;组织图&#xff0c;培训&#xff0c;团…