文章目录

  • 插入数据
  • 批量插入数据
  • 插入和更新数据
    • 在 MySQL 中插入或更新数据使用 `ON DUPLICATE KEY UPDATE`
    • 在 PostgreSQL 中插入或更新数据使用 `INSERT ON CONFLICT`

INSERT INTO 语句用于向表中插入新记录。

首先创建一个 fruit 表,表结构如下所示:

+----+------------+-------------+
| id | name       | floor_price |
+----+------------+-------------+
|  0 | Apple      |         100 |
+----+------------+-------------+

插入数据

第一种形式无需指定要插入数据的列名,只需提供被插入的值即可,语法如下所示:

INSERT INTO table_name
VALUES (value1,value2,value3,...);

实例如下:

INSERT INTO fruit
VALUES (2, 'Banana', 36.9);

第二种形式需要指定列名及被插入的值,语法如下所示:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

实例如下:

INSERT INTO fruit (id, name, floor_price)
VALUES (2, 'Banana', 36.9);

批量插入数据

批量插入的基本语法如下所示:

INSERT INTO table_name (column1, column2)
VALUES(value1, value2),(value3, value4),(value5, value6),(value7, value8);

实例如下:

INSERT INTO fruit (id, name, floor_price)
VALUES (1, 'Apple', 100.0),(2, 'Banana', 36.9),(3, 'Pear', 0.6),(4, 'Peach', 1.1);

数据库中表数据如下:

+----+------------+-------------+
| id | name       | floor_price |
+----+------------+-------------+
|  1 | Apple      |         100 |
|  2 | Banana     |        36.9 |
|  3 | Pear       |         0.6 |
|  4 | Peach      |         1.1 |
+----+------------+-------------+

插入和更新数据

在许多情况下,我们可能希望确保表中存在一条记录而没有冲突的条目。本质上,我们希望查找并修改当前记录(如果存在),或者添加具有所需值的新记录(如果尚未存在),这通常称为“upsert”操作(“insert”和“update”的组合)。

“upsert” 操作的实际实现在不同数据库中有不同的实现方式,下面主要介绍 MySQL 和 PostgreSQL 的实现方式。

在 MySQL 中插入或更新数据使用 ON DUPLICATE KEY UPDATE

MySQL 允许我们使用 ON DUPLICATE KEY UPDATE 子句来修改 INSERT 命令来执行此操作。接下来将介绍如何使用此构造来更新条目的值(如果存在),或者将其添加为表中的新行。

插入或更新操作的基本语法如下所示:

INSERT INTO table_name (column1, column2)
VALUES(value1, value2),(value3, value4),(value5, value6),(value7, value8)
ON DUPLICATE KEY UPDATE<column1> = <value1>,<column2> = <value2>;

ON DUPLICATE KEY UPDATE 子句之后可以提供多个列,每个列定义如果与现有记录发生冲突,新值应该是什么。

实例如下:

INSERT INTO fruit (id, name, floor_price)
Values (1, 'Apple', 100.0),(2, 'Banana', 44.9),(3, 'Pear', 50.6),(4, 'Peach', 71.1),(5, 'Strawberry', 29.5)
ON DUPLICATE KEY UPDATE id          = Values(id),name        = Values(name),floor_price = Values(floor_price);

数据库中表数据如下:

+----+------------+-------------+
| id | name       | floor_price |
+----+------------+-------------+
|  1 | Apple      |         100 |
|  2 | Banana     |        44.9 |
|  3 | Pear       |        50.6 |
|  4 | Peach      |        71.1 |
|  5 | Strawberry |        29.5 |
+----+------------+-------------+

MySQL 将接受该语句,插入id 为 “5” 的新行,并更新与现有记录冲突的行(已经有id 为“1”、“2”、“3”、“4”的记录),但是它们的floor_price 不一样。

在 PostgreSQL 中插入或更新数据使用 INSERT ON CONFLICT

PostgreSQL 中的实际实现使用带有特殊 ON CONFLICT 子句的 INSERT 命令来指定如果表中已经存在记录时要做什么。如果记录已在表中找到,您可以指定是否要更新该记录或静默跳过该记录。

插入或更新操作的基本语法如下所示:

INSERT INTO table_name (column1, column2)
VALUES(value1, value2),(value3, value4),(value5, value6),(value7, value8)
ON CONFLICT <target> <action>;

<target> 指定发生冲突时我们要为其定义的策略。可以是以下任何一种:

  • 特定列或列的名称:(column1)
  • 唯一约束的名称: ON CONSTRAINT <constraint_name>

<action> 定义 PostgreSQL 在发生冲突时应该做什么。指定的 <action> 可以是以下之一:

  • DO NOTHING:告诉 PostgreSQL 保留冲突记录原样。本质上,此操作不会进行任何更改,但会抑制在我们尝试插入违反条件的行时通常会发生的错误。
  • DO UPDATE:这告诉 PostgreSQL 我们想更新表中已经存在的行。更新的语法反映了普通 UPDATE 命令的语法。

当指定 DO UPDATE 时,一个名为 EXCLUDED 的特殊虚拟表可在 UPDATE 子句中使用。该表包含原始 INSERT 命令中建议的值(与现有表值冲突)。

DO UPDATE 操作的实例如下:

INSERT INTO fruit
VALUES (1, 'Apple', 100.0),(2, 'Banana', 44.9),(3, 'Pear', 60.6),(4, 'Peach', 71.1),(5, 'Strawberry', 29.5),(6, 'Tomato', 85.5)
ON CONFLICT (id) DO UPDATE SET id          = EXCLUDED.id,name        = EXCLUDED.name,floor_price = EXCLUDED.floor_price;

数据库中表数据如下:

 id |    name    | floor_price
----+------------+-------------0 | apple      |        74.51 | Apple      |         1002 | Banana     |        44.93 | Pear       |        60.64 | Peach      |        71.15 | Strawberry |        29.56 | Tomato     |        85.5

数据库 insert 数据的几种方式相关推荐

  1. mysql数据库导入数据的几种方式

    mysql数据库导入数据的几种方式 适用于大量数据的导入 一.excel方式导入 1.将需要的数据放到表格中,需要注意表格中的列必须与要导入的表保持一致 2.导入步骤 二.csv文件导入 1.一般拿到 ...

  2. mysql数据库删除数据的三种方式:

    mysql数据库删除数据的三种方式: delete from table where 直接删除表中的某一行数据,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.所以delete相 ...

  3. oracle读取数据方式,关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

  4. oracle从mysql抓数据_关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

  5. clickhouse数据库删除数据的五种方式

    文章目录 前言 一.通过删除表分区的方式 二.执行delete方式 三.执行truncate方式 四.设置表数据生命周期 五.删除数据文件目录 总结 前言 clickhouse数据库清理数据的方式很多 ...

  6. oracle 删除原有的数据,oracle数据库删除数据的两种方式

    当表中的数据不需要是,则应该删除该数据,并释放所占用的空间; 删除表中的数据有delete和truncate两种方式,下面分别介绍: 一.delete语句 (1)有条件删除 语法格式:delete [ ...

  7. 数据库 删除数据的三种方式

    delete from 删除数据,不删除表结构,可与where连用,删除某条数据或某些数据,特点:删除速度慢,可删除部分数据. 样例: 删除全部数据:delete from dept; 删除某条数据: ...

  8. android sqlite使用之模糊查询数据库数据的三种方式

    android sqlite使用之模糊查询数据库数据的三种方式 android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sql ...

  9. Android中实现SQLite数据库CRUD操作的两种方式

    Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...

  10. oracle--day2(单值函数(字符函数,日期函数,转换函数,数字函数),日期格式(yyyy,mm等含义),表示一个日期数据的4种方式,多表查询(连接查询(等值连接,不等值连接,外连接,自连接))

    第三章:单值函数     函数分为:       1.单值函数           1.字符函数           2.日期函数           3.转换函数           4.数字函数 ...

最新文章

  1. Android 补间动画(Tween Animation)
  2. js里的匿名函数 数组排序
  3. php有哪几种,php数据类型包括哪几种
  4. 《数字时代汽车营销变革白皮书》发布,为新消费时代的车企营销提供指南
  5. 开局崩盘!IDEA 2020 无法启动的解决办法|赠送 IDEA 2020 新功能
  6. 手机 safari mac 调试
  7. 为什么土豆网王微会放弃自己原有的立场,跟优酷合并 合并后有何影响
  8. CCS7.0从安装到使用
  9. 基于springboot vue h5 手机商城源码
  10. GIS数据转换成CAD数据,还原显示CASS码、符号样式及高程值等图形属性的解决方案,shp转dwg,arcgis数据转CAD数据
  11. comsol 4.4 matlab,如何使用COMSOL with MATLAB的清单
  12. HDFS副本存放机制
  13. CBLUE-阿里天池中文医疗NLP打榜
  14. java字母映射_一个字符串,由大写字母构成,把字母映射成数字
  15. window11 + Bibtex4Word + Texlive2021 安装过程
  16. 我擦!硬盘文件全被人删了!!
  17. 穿戴式心电信号采集系统设计(任务书+lunwen+答辩PPt+查重报告)
  18. 小游戏:HelloColor
  19. 找不到模块“xxx.vue”或其相应的类型声明。ts
  20. 论文阅读:HeadGAN: One-shot Neural Head Synthesis and Editing

热门文章

  1. BUUCTF-[XMAN2018排位赛]ppap
  2. 学会对VUE的SEO优化,你的网站总是排在前面
  3. KafKa 启动异常 : ERROR Failed to clean up log for __consumer_offsets-30 in dir 另一个程序正在使用此文件,进程无法访问
  4. 可买房摇号,北京市工作居住证全面解读
  5. Unity_粒子系统特效制作_051
  6. vscode 脑图插件mindmap
  7. Spring Boot 监听 Activemq 中的特定 topic ,并将数据通过 RabbitMq 发布出去
  8. android监听系统来电并弹出提示窗口,Android 监听来去电 弹出悬浮窗提示
  9. 【HTML 5】HTML5 Canvas rect(), strokeRect() 和 fillRect() 的区别
  10. 世界上第一次网络瘫痪 | 历史上的今天