PostgreSQL數(shù)據(jù)庫事務(wù)插入刪除及更新操作示例
INSERT
使用INSERT語句可以向表中插入數(shù)據(jù)。
創(chuàng)建一個表:
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));
向表中插入數(shù)據(jù):
INSERT語句格式:
里面的(列1,列2,…)稱為列清單;(值1,值2,…)稱為值清單。列清單和值清單個數(shù)要保持一致。
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');
對表的所有列進(jìn)行INSERT時(shí),可省略列清單。從左到右將值清單里面數(shù)據(jù)賦給每一列。
INSERT INTO ProductIns VALUES ('0005', '鐵鍋', '廚房用具', 6800, 5000, '2222-01-15');
插入NULL,直接在值清單里面寫NULL就行,前提是插入NULL的列不能設(shè)置NOT NULL約束。
INSERT INTO ProductIns VALUES ('0006', '勺子', '廚房用具', 500, NULL, '2222-09-20');
插入默認(rèn)值:
前面創(chuàng)建ProductIns表設(shè)置sale_price默認(rèn)值為0。在創(chuàng)建表的時(shí)候,設(shè)定了默認(rèn)值,使用INSERT語句插入默認(rèn)值的方法如下。
--顯式方法設(shè)置默認(rèn)值 INSERT INTO ProductIns VALUES ('0007', '筷子', '廚房用具', DEFAULT, 790, '2222-04-28');
隱式方法設(shè)置默認(rèn)值,在列清單和值清單里面,省略設(shè)置為默認(rèn)值的列。
如果省略未設(shè)置為默認(rèn)值的列,該列的值將被置為NULL。這一列如果是NOT NULL約束,將報(bào)錯。
--隱式方法設(shè)置默認(rèn)值 INSERT INTO ProductIns (product_id, product_name, product_type, purchase_price, regist_date) VALUES ('0007', '筷子', '廚房用具', 790, '2222-04-28');
從其他表中復(fù)制數(shù)據(jù):
創(chuàng)建一張和Product結(jié)構(gòu)相同的表。
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表中數(shù)據(jù)插入到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語句進(jìn)行插入:
創(chuàng)建一個以商品種類匯總的表。
CREATE TABLE ProductType (product_type VARCHAR(32) NOT NULL, sum_sale_price INTEGER , sum_purchase_price INTEGER , PRIMARY KEY (product_type));
通過下面,得到一個根據(jù)商品種類分組的表,并且計(jì)算出每個種類的價(jià)格的和。
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;
DELETE
DROP TABLE語句,將表刪除。
DELETE語句,刪除表里面的數(shù)據(jù)。
DELETE語句的對象是行,不是列,無法只刪除部分列的數(shù)據(jù)。
刪除全部數(shù)據(jù)行:
格式 DELETE FROM <表名>; 例子 DELETE FROM Product;
刪除部分?jǐn)?shù)據(jù)行:
格式 DELETE FROM <表名> WHERE <條件>; 例子 DELETE FROM Product WHERE sale_price >= 2000;
UPDATE
UPDATE語句用于改變表中數(shù)據(jù)。
格式:
UPDATE <表名> SET <列名> = <表達(dá)式>;
改變r(jià)egist_date列的所有數(shù)據(jù)。
UPDATE Product SET regist_date = '2222-02-02';
修改后效果如下。
更新部分?jǐn)?shù)據(jù)行:
UPDATE <表名> SET <列名> = <表達(dá)式> WHERE <條件>;
UPDATE Product SET sale_price = sale_price * 10 WHERE product_type = '廚房用具';
將列更新為NULL:
前提是這個列沒有設(shè)置NOT NULL約束和主鍵約束。
UPDATE Product SET regist_date = NULL WHERE product_id = '0008';
同時(shí)更新多個列:
-- 使用逗號,所有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 = '廚房用具';
事務(wù)
事務(wù)transaction,需要在同一處理單元中執(zhí)行的一系列更新處理的集合。
有時(shí)候要對一個表進(jìn)行多個處理。比如為了某件事,需要把a(bǔ)的價(jià)格增加,把b的價(jià)格減少,此時(shí),多個處理是作為同一個處理單元執(zhí)行的。這個時(shí)候就可以用事務(wù)來處理。
格式:
事務(wù)開始語句; DML語句1; DML語句2; ... 事務(wù)結(jié)束語句;
例子:
其中,用戶需要明確指出事務(wù)的結(jié)束。結(jié)束事務(wù)的指令有COMMIT、ROLLBACK。
COMMIT,提交事務(wù)包含的更新處理。一旦提交,無法恢復(fù)事務(wù)開始前的狀態(tài)。
ROLLBACK,取消事務(wù)包含的更新處理,相當(dāng)于放棄保存,恢復(fù)事務(wù)開始前的狀態(tài)。
事務(wù)在數(shù)據(jù)庫連接建立時(shí),已經(jīng)悄悄開始。
不使用開始語句情況下,SQL Server、PostgreSQL、MySQL里面默認(rèn)使用自動提交模式,每條SQL語句就是一個事務(wù)。
Oracle里面,是直到用戶執(zhí)行COMMIT或者ROLLBACK,算一個事務(wù)。
--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的事務(wù)遵循ACID特性。
原子性Atomicity,事務(wù)結(jié)束時(shí),其中的更新處理要么都執(zhí)行(COMMIT),要么都不執(zhí)行(ROLLBACK)。
一致性Consistency,事務(wù)中的處理,要滿足數(shù)據(jù)庫設(shè)置的約束,如主鍵約束、NOT NULL約束。
隔離性Isolation,不同事務(wù)之間互不干擾。一個事務(wù)向表中添加數(shù)據(jù),沒提交前,別的事務(wù)看不到新添加的數(shù)據(jù)。
持久性Durability,事務(wù)結(jié)束后,該時(shí)間點(diǎn)的數(shù)據(jù)狀態(tài)會被保存。如果由于系統(tǒng)故障數(shù)據(jù)丟失,也能用一些方法恢復(fù)。
以上就是PostgreSQL事務(wù)的插入刪除及更新操作示例的詳細(xì)內(nèi)容,更多關(guān)于PostgreSQL事務(wù)插入刪除更新的資料請關(guān)注腳本之家其它相關(guān)文章!
- PostgreSQL如何查看事務(wù)所占有的鎖實(shí)操指南
- PostgreSQL 存儲過程的進(jìn)階講解(含游標(biāo)、錯誤處理、自定義函數(shù)、事務(wù))
- PostgreSQL長事務(wù)與失效的索引查詢淺析介紹
- PostgreSQL長事務(wù)概念解析
- PostgreSQL事務(wù)回卷實(shí)戰(zhàn)案例詳析
- 基于Postgresql 事務(wù)的提交與回滾解析
- PostgreSQL數(shù)據(jù)庫事務(wù)實(shí)現(xiàn)方法分析
- PostgreSQL數(shù)據(jù)庫事務(wù)出現(xiàn)未知狀態(tài)的處理方法
- 深入理解PostgreSQL 事務(wù)處理
相關(guān)文章
PostgreSQL upsert(插入更新)數(shù)據(jù)的操作詳解
這篇文章主要介紹了PostgreSQL upsert(插入更新)教程詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01PostgreSQL更新表時(shí)時(shí)間戳不會自動更新的解決方法
這篇文章主要為大家詳細(xì)介紹了PostgreSQL更新表時(shí)時(shí)間戳不會自動更新的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10PostgreSQL 使用raise函數(shù)打印字符串
這篇文章主要介紹了PostgreSQL 使用raise函數(shù)打印字符串,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01postgresql的now()與Oracle的sysdate區(qū)別說明
這篇文章主要介紹了postgresql的now()與Oracle的sysdate區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12PostgreSQL的日期時(shí)間差DATEDIFF實(shí)例詳解
PostgreSQL是一款簡介而又性能強(qiáng)大的數(shù)據(jù)庫應(yīng)用程序,其在日期時(shí)間數(shù)據(jù)方面所支持的功能也都非常給力,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL的日期時(shí)間差DATEDIFF的相關(guān)資料,需要的朋友可以參考下2023-04-04PostgreSQL教程(六):函數(shù)和操作符詳解(2)
這篇文章主要介紹了PostgreSQL教程(六):函數(shù)和操作符詳解(2),本文講解了模式匹配、數(shù)據(jù)類型格式化函數(shù)、時(shí)間/日期函數(shù)和操作符等內(nèi)容,需要的朋友可以參考下2015-05-05