【postgresql 基础入门】插入数据的多种方式 单条,多值,查询结果,插入数据冲突处理,批量导入,多种方式让数据插入更灵活

本文主要是介绍【postgresql 基础入门】插入数据的多种方式 单条,多值,查询结果,插入数据冲突处理,批量导入,多种方式让数据插入更灵活,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

添加表数据

专栏内容

  • postgresql内核源码分析
  • 手写数据库toadb
  • 并发编程

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

系列文章

  • 入门准备
  • postgrersql基础架构
  • 快速使用
  • 初始化集群
  • 数据库服务管理
  • psql客户端使用
  • pgAdmin图形化客户端
  • 数据库的使用
  • 创建数据库
  • 数据库操作
  • 表的使用
  • 表的创建
  • 表的操作
  • 数据查询
  • 数据查询
  • 多表联合查询
  • 数据操作
  • 插入数据的方式

文章目录

  • 添加表数据
  • 系列文章
  • 前言
  • 概述
  • 单条插入 (Single Insert)
  • 多条插入(Multiple Insert)
  • 带冲突处理(Conflict Handling)
    • DO NOTHING
    • DO UPDATE
  • 将查询结果插入表中
  • 批量导入 (Bulk Insert):
  • 总结
  • 结尾

前言

postgresql 数据库是一款通用的关系型数据,在开源数据库中能与商业数据媲美,在业界也越来越流行。

因为是开源数据库,不仅公开源码,还有很多使用案例,好用的插件,所以它的慢慢变成了数据库的先驱和标准,通过postgresql可以很好从使用到原理,彻底搞懂;

如果是学习编程,也可以学到丰富的编程知识,数据结构,编程技巧,它里面还有很多精妙的架构设计,分层思想,可以灵活定制的思想。

本专栏主要介绍postgresql 入门使用,数据库维护管理,通过这些使用来了解数据库原理,慢慢了解postgresql是什么样的数据库,能做那些事情,以及如何做好服务,最关键的是这些知识都是面试的必备项。

概述

通过前几篇文文章,我们了解了postgresql 的服务启停,数据表的管理,接下来就是给我们创建的表添加数据,进行真正的使用了。

数据库表添加数据通常使用insert语句,可以进行单条数据的插入,也可以进行多value的插入,还可以写到sql脚本中进行批量插入;当然,也可以将查询结果存入一张表中;

下面我们就来一起看看各种方法的使用。

单条插入 (Single Insert)

常用的插入语句就是insert into 往某张表中插入一条数据,它的语法形式如下:

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

假设有一个名为"users"的表,具有"id"、"name"和"age"三个列,你可以使用以下语句将一条新记录插入到表中:

INSERT INTO users (id, name, age)
VALUES (1, 'John Doe', 25);

这将向"users"表插入一条新的记录。

多条插入(Multiple Insert)

如果有多条数据,我们可以在一条insert into 语句中一次性插入到某张表中,它的语法形式如下:

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

你可以一次插入多条记录到表中。在上面的示例中,将同时插入三条记录到"users"表中。

INSERT INTO users (id, name, age) 
VALUES (2, 'White', 27),  (3, 'Greenly', 33), (4, 'James', 20);

在使用 insert into 时,当我们对表中的每个字段都有值对应时,可以只指定表名即可,不用列出所有的列名;

INSERT INTO users  
VALUES (2, 'White', 27), (3, 'Greenly', 33, (4, 'James', 20);

带冲突处理(Conflict Handling)

在插入数据时,可能会遇到冲突,例如插入重复的唯一索引或主键值。 PostgreSQL提供了ON CONFLICT子句来处理冲突。

可以有以下选项:

  • DO NOTHING 当冲突发生时,什么都不做,也就不插入数据;
  • DO UPDATE 当冲突发生时,执行update操作,更新冲突列以外的列的值;

DO NOTHING

INSERT INTO users (id, name, age)
VALUES (1, 'John Doe', 25)
ON CONFLICT (id) DO NOTHING;

如果"id"列的值已经存在于"users"表中,将不执行任何操作。

DO UPDATE

INSERT INTO users (id, name, age)
VALUES (1, 'John Doe', 25)
ON CONFLICT (id) DO UPDATE;

你可以根据自己的需求,选择使用DO NOTHINGDO UPDATE或其他操作来处理冲突。

ON CONFLICT DO UPDATE保证一个原子的 INSERT或者 UPDATE结果。在没有无关错误的前提下,这两种 结果之一可以得到保证,即使在很高的并发度也能保证。这也可以被称作 UPSERT — “UPDATE 或 INSERT”。

需要注意的是,DO UPDATE不能在分区表上使用,因为update后,所有在分区有可能会发生变化;

当然还可以带条件选择进行DO UPDATE, 也就是条件满足时,update动作;

postgres=# INSERT INTO users (id, name, age)
VALUES (1, 'John Doe', 10)
ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name WHERE users.age < 18;
INSERT 0 0

当 age小于18岁时,我们才会更新名字,大于等于18的会选择忽略;

这时会用EXLUDED 来引用要插入的数据,类似一个虚拟的表,而通过原表名引用当前表中已经存在的数据,如上例中,当前表中的age < 18时,才会将name 字段更新为 新值,用excluded字段引用,这里看到更新条数为0,因为表中的age是25;

将查询结果插入表中

表数据的来源,还可以是SQL的查询结果, 通过 INSERT INTO ... SELECT 语法,将查询的结果插入表中。

postgres=# create table user_A(id int primary key, name varchar, order_date date, total_amount numeric(10,2));
CREATE TABLEpostgres=# insert into user_A(id,name,order_date,total_amount) select c.customer_id, c.customer_name, o.order_date, o.total_amount from orders o, products p, customers c where o.customer_id = c.customer_id and o.order_id = p.product_id and total_amount > 100;
INSERT 0 2

新创建一张表user_A, 然后使用我们前面分享的关联查询的方法,从三张表中查到消费总计超过100的消费者信息,记录到user_A中,这样就将优质客户信息单独记录到一张表中。

批量导入 (Bulk Insert):

如果你需要批量导入大量数据,可以使用COPY命令,它可以将一个文件的格式化的数据批量导入一张表中。

COPY table_name (column1, column2, column3) FROM '/path/to/data.csv' CSV;

这个命令将从指定的CSV文件路径将数据导入到表中,你需要确保CSV文件的列与表的列相匹配,文件中各字段值间的分隔符必须是相同的,每行数据占一行;

总结

通过本文的分享,了解了数据表中如何添加数据,有单条直接插入,这也是常用的SQL,还有多个值同时插入,以及插入时的冲突处理,此外还有将带条件查询结果插入表中,批量插入等高级用法。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

这篇关于【postgresql 基础入门】插入数据的多种方式 单条,多值,查询结果,插入数据冲突处理,批量导入,多种方式让数据插入更灵活的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/164466

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u