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
postgresql无序uuid性能测试及对数据库的影响
Jun 11 PostgreSQL
PostgreSQL解析URL的方法
Aug 02 PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Mar 21 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL聚合函数介绍以及分组和排序
Apr 12 PostgreSQL
PostgreSQL之连接失败的问题及解决
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
Mysql的常用命令
2006/10/09 PHP
使用PHP静态变量当缓存的方法
2013/11/13 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
PHP中each与list用法分析
2016/01/08 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
Python MD5文件生成码
2009/01/12 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
Python子类继承父类构造函数详解
2019/02/19 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
Python中关于浮点数的冷知识
2019/09/22 Python
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
财务管理专业推荐信
2013/11/19 职场文书
会计电算化专业毕业生自荐信
2013/12/20 职场文书
十佳青年事迹材料
2014/08/21 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
python的html标准库
2022/04/29 Python