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存储过程实用脚本(二):创建函数入门
Apr 05 PostgreSQL
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
Apr 22 PostgreSQL
Centos环境下Postgresql 安装配置及环境变量配置技巧
May 18 PostgreSQL
postgresql使用filter进行多维度聚合的解决方法
Jul 16 PostgreSQL
PostgreSQL解析URL的方法
Aug 02 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL怎么创建分区表详解
Jun 25 PostgreSQL
postgresql中如何执行sql文件
May 08 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
详解如何理解vue的key属性
2019/04/14 Javascript
python zip文件 压缩
2008/12/24 Python
实例讲解Python中的私有属性
2014/08/21 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
解决Python一行输出不显示的问题
2018/12/03 Python
利用python计算时间差(返回天数)
2019/09/07 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
美国智能家居专家:tink
2019/06/04 全球购物
档案接收函
2014/01/13 职场文书
yy婚礼主持词
2014/03/14 职场文书
总经理任命书
2014/03/29 职场文书
春节请假条
2014/04/11 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js