PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction


Posted in PostgreSQL onApril 12, 2022

INSERT

使用INSERT语句可以向表中插入数据。

创建一个表:

CREATE TABLE ProductIns
(product_id      CHAR(4)      NOT NULL,
 product_name    VARCHAR(100) NOT NULL,
 product_type    VARCHAR(32)  NOT NULL,
 sale_price      INTEGER      DEFAULT 0,
 purchase_price  INTEGER      ,
 regist_date     DATE         ,
 PRIMARY KEY (product_id));

向表中插入数据:

INSERT语句格式:

里面的(列1,列2,…)称为列清单;(值1,值2,…)称为值清单。列清单和值清单个数要保持一致。

INSERT INTO <表名> (列1,列2,...) VALUES (值1,值2,...);
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2222-09-20');

对表的所有列进行INSERT时,可省略列清单。从左到右将值清单里面数据赋给每一列。

INSERT INTO ProductIns VALUES ('0005', '铁锅', '厨房用具', 6800, 5000, '2222-01-15');

插入NULL,直接在值清单里面写NULL就行,前提是插入NULL的列不能设置NOT NULL约束。

INSERT INTO ProductIns VALUES ('0006', '勺子', '厨房用具', 500, NULL, '2222-09-20');

插入默认值:

前面创建ProductIns表设置sale_price默认值为0。在创建表的时候,设定了默认值,使用INSERT语句插入默认值的方法如下。

--显式方法设置默认值
INSERT INTO ProductIns VALUES ('0007', '筷子', '厨房用具', DEFAULT, 790, '2222-04-28');

隐式方法设置默认值,在列清单和值清单里面,省略设置为默认值的列。

如果省略未设置为默认值的列,该列的值将被置为NULL。这一列如果是NOT NULL约束,将报错。

--隐式方法设置默认值
INSERT INTO ProductIns (product_id, product_name, product_type, purchase_price, regist_date) VALUES ('0007', '筷子', '厨房用具', 790, '2222-04-28');

从其他表中复制数据:

创建一张和Product结构相同的表。

CREATE TABLE ProductCopy
(product_id      CHAR(4)      NOT NULL,
 product_name    VARCHAR(100) NOT NULL,
 product_type    VARCHAR(32)  NOT NULL,
 sale_price      INTEGER      ,
 purchase_price  INTEGER      ,
 regist_date     DATE         ,
 PRIMARY KEY (product_id));

可以像下面把Product表中数据插入到ProductCopy表里。INSERT语句里面的SELECT语句,可以使用WHERE子句、GROUP BY子句等等。

INSERT INTO ProductCopy (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price, purchase_price, regist_date
  FROM Product;

使用包含GROUP BY子句的SELECT语句进行插入:

创建一个以商品种类汇总的表。

CREATE TABLE ProductType
(product_type        VARCHAR(32)  NOT NULL,
 sum_sale_price      INTEGER      ,
 sum_purchase_price  INTEGER      ,
 PRIMARY KEY (product_type));

通过下面,得到一个根据商品种类分组的表,并且计算出每个种类的价格的和。

INSERT INTO ProductType (product_type, sum_sale_price, sum_purchase_price)
SELECT product_type, SUM(sale_price), SUM(purchase_price)
  FROM Product
 GROUP BY product_type;

PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction

DELETE

DROP TABLE语句,将表删除。

DELETE语句,删除表里面的数据。

DELETE语句的对象是行,不是列,无法只删除部分列的数据。

删除全部数据行:

格式
DELETE FROM <表名>;
例子
DELETE FROM Product;

删除部分数据行:

格式
DELETE FROM <表名>
WHERE <条件>;
例子
DELETE FROM Product
WHERE sale_price >= 2000;

UPDATE

UPDATE语句用于改变表中数据。

格式:

UPDATE <表名>
SET <列名> = <表达式>;

改变regist_date列的所有数据。

UPDATE Product
   SET regist_date = '2222-02-02';

修改后效果如下。

PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction

更新部分数据行:

UPDATE <表名>
SET <列名> = <表达式>
WHERE <条件>;
UPDATE Product
   SET sale_price = sale_price * 10
 WHERE product_type = '厨房用具';

将列更新为NULL:

前提是这个列没有设置NOT NULL约束和主键约束。

UPDATE Product
   SET regist_date = NULL
 WHERE product_id = '0008';

同时更新多个列:

-- 使用逗号,所有DBMS中均可使用
UPDATE Product
   SET sale_price = sale_price * 10,
       purchase_price = purchase_price / 2
 WHERE product_type = '厨房用具';
-- 列表形式,在某些DBMS中无法使用
UPDATE Product
   SET (sale_price, purchase_price) = (sale_price * 10, purchase_price / 2)
 WHERE product_type = '厨房用具';

事务

事务transaction,需要在同一处理单元中执行的一系列更新处理的集合。

有时候要对一个表进行多个处理。比如为了某件事,需要把a的价格增加,把b的价格减少,此时,多个处理是作为同一个处理单元执行的。这个时候就可以用事务来处理。

格式:

事务开始语句;
DML语句1;
DML语句2;
...
事务结束语句;

例子:

其中,用户需要明确指出事务的结束。结束事务的指令有COMMIT、ROLLBACK。

COMMIT,提交事务包含的更新处理。一旦提交,无法恢复事务开始前的状态。

ROLLBACK,取消事务包含的更新处理,相当于放弃保存,恢复事务开始前的状态。

事务在数据库连接建立时,已经悄悄开始。

不使用开始语句情况下,SQL Server、PostgreSQL、MySQL里面默认使用自动提交模式,每条SQL语句就是一个事务。

Oracle里面,是直到用户执行COMMIT或者ROLLBACK,算一个事务。

--PostgreSQL
BEGIN TRANSACTION;
    UPDATE Product
       SET sale_price = sale_price + 1000
     WHERE product_name = 'T恤';
    UPDATE Product
       SET sale_price = sale_price - 1000
     WHERE product_name = '裤子';
COMMIT;

DBMS的事务遵循ACID特性。

原子性Atomicity,事务结束时,其中的更新处理要么都执行(COMMIT),要么都不执行(ROLLBACK)。

一致性Consistency,事务中的处理,要满足数据库设置的约束,如主键约束、NOT NULL约束。

隔离性Isolation,不同事务之间互不干扰。一个事务向表中添加数据,没提交前,别的事务看不到新添加的数据。

持久性Durability,事务结束后,该时间点的数据状态会被保存。如果由于系统故障数据丢失,也能用一些方法恢复。

PostgreSQL 相关文章推荐
浅谈PostgreSQL表分区的三种方式
Jun 29 PostgreSQL
基于PostgreSQL/openGauss 的分布式数据库解决方案
Dec 06 PostgreSQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
Jan 18 PostgreSQL
Rust 连接 PostgreSQL 数据库的详细过程
Jan 22 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 07 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
PostgreSQL常用字符串分割函数整理汇总
Jul 07 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 07 #PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 #PostgreSQL
PostgreSQL事务回卷实战案例详析
Mar 25 #PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Rust 连接 PostgreSQL 数据库的详细过程
Jan 22 #PostgreSQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
You might like
一个简单的PHP投票程序源码
2007/03/11 PHP
eAccelerator的安装与使用详解
2013/06/13 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
python爬取哈尔滨天气信息
2018/07/14 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
酒店管理专业学生求职信
2013/09/27 职场文书
模具数控专业自荐信
2014/01/27 职场文书
我的中国梦口号
2014/06/16 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
离职证明格式样本
2015/06/12 职场文书
Java基础——Map集合
2022/04/01 Java/Android