数据的更新处理大体可以分为插入(INSERT)、删除(DELETE)和更新(UPDATE)三类
4-1 数据的插入(INSERT语句的使用方法)
-
INSERT语句的基本语法
将列名和值用逗号隔开,分别括在()内,这种形式称为清单
原则上,执行一次INSERT语句会插入一行数据。因此,插入多行时,通常需要循环执行相应次数的INSERT语句,但是实际上,很多RDBMS都支持一次插入多行数据,这样的功能称为多行INSERT,使用时只需将多条VALUES子句通过逗号进行分隔排列即可,但需注意该用法不适用于Oracle,具体说明见下:
-
列清单的省略
对表进行全列INSERT时,可以省略表名后的列清单。这时VALUES子句的值会默认按照从左到右的顺序赋给每一列
-
插入NULL
INSERT语句中想给某一列赋予NULL值时,可以直接在VALUES子句的值清单中写入NULL
-
插入默认值
可以通过在创建表的CREATE TABLE语句中设置DEFAULT约束来设定默认值,其形式是
DEFAULT <默认值>
-
通过显式方法插入默认值
在VALUES子句中指定DEFAULT关键字
-
通过隐式方法插入默认值
插入默认值时也可以不使用DEFAULT关键字,只要在列清单和值清单中省略设定了默认值的列就可以了,但是如果省略了没有设定默认值的列,该列的值就会被设定为NULL
-
-
从其他表中复制数据(INSERT…SELECT语句)
INSERT语句的SELECT语句中,可以使用WHERE子句或者GROUP BY子句等任何SQL语法(但是使用ORDER BY 子句并不会产生任何效果)
4-2 数据的删除(DELETE语句的使用方法)
-
DROP TABLE语句和DELETE语句
删除数据的方法大体可以以下两种:
- DROP TABLE语句可以将表完全删除
- DELETE 语句会留下表(容器),而删除表中的全部数据
-
DELETE语句的基本语法
-
指定删除对象的DELETE语句(搜索型DELETE)
想要删除部分数据行时,可以像SELECT语句那样使用WHERE子句指定删除条件。这种指定了删除对象的DELETE语句称为搜索型DELETE
-- 删除部分数据行的搜索型DELETE DELETE FROM 表名 WHERE 条件
与SELECT语句不同,DELETE语句中不能使用GROUP BY、HAVING和ORDER BY三类子句,而只能使用WHERE子句。 原因很简单,GROUP BY和HAVING是从表中选取数据时用来改变抽取数据形式的,而ORDER BY是用来指定取得结果显示顺序的。因此,在删除表中数据时它们都起不到作用
-
TRUMCATE
4-3 数据的更新(UPDATE语句的使用方法)
-
UPDATE语句的基本语法
-- 改变表中数据的UPDATE语句 UPDATE 表名 SET 列名 = 表达式 -- 将更新对象的列和更新后的值都记述在SET子句中
-
指定条件的UPDATE语句(搜索型UPDATE)
-- 更新部分数据行的搜索型UPDATE UPDATE 表名 SET 列名 = 表达式 WHERE 条件
-
使用UPDATE语句可以将值清空为NULL,即和INSERT一样,UPDATE语句也可以将NULL作为一个值来使用(但只限于未设置NOT NULL约束和主键约束的列)
-
多列更新 —— UPDATE语句的SET子句支持同时将多个列作为更新对象
实际应用中通常都会使用第一种方法,因为方法2在某些DBMS中是无法使用的
4-4 事务
-
什么是事务(transaction)
在RDBMS中,事务是对表中数据进行更新的单元。简单来说,事务就是需要在同一个处理单元中执行的一系列更新处理的集合;一个事务中包含多少个更新处理或者包含哪些处理,在DBMS中并没有固定的标准,而是根据用户的要求决定的
-
创建事务
-- 事务的语法 事务开始语句; DML语句1; DML语句2; DML语句3; ... 事务结束语句(COMMIT或者ROLLBACK); -- 使用事务开始和事务结束语句,将一系列DML语句(INSERT/UPDATE/DELETE语句)括起来,就实现了一个事务处理 -- 需要特别注意事务的开始语句,实际上,在标准SQL中并没有定义事务的开始语句,而是由各个DBMS自己来定义的,比较有代表性的语法如下: -- SQL Server、PostgreSQL BEGIN TRANSACTION -- MySQL START TRANSACTION -- Oracle、DB2 无 -- 事务结束语句只有COMMIT和ROLLBACK两种,在所有的RDBMS中都是通用的
-
COMMIT——提交处理
COMMIT是提交事务包含的全部更新处理的结束指令,相当于文件处理中的覆盖保存,一旦提交,就无法恢复到事务开始前的状态了
-
ROLLBACK——取消处理
ROLLBACK是取消事务包含的全部更新处理的结束指令,相当于文件处理中的放弃保存,一旦回滚,数据库就会恢复到事务开始之前的状态
-
事务处理何时开始
-
ACID特性
DBMS的事务都遵循四种特性,将这四种特性的首字母结合起来统称为ACID特性。这是所有DBMS都必须遵守的规则
-
原子性(Atomicity)
原子性是指事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行,也就是要么占有一切要么一无所有
-
一致性(Consistency)
一致性指的是事务中包含的处理要满足数据库提前设置的约束,如主键约束或者NOT NULL约束等。例如,设置了NOT NULL约束的列是不能更新为NULL的,试图插入违反主键约束恶记录就会出错,无法执行。对事务来说,这些不合法的SQL会被回滚。也就是说,这些SQL处理会被取消,不会执行
-
隔离性(Isolation)
隔离性指的是保证不同事务之间互不干扰的特性。该特性保证了事务之间不会互相嵌套。此外,在某个事务中进行的更改,在该事务结束之前,对其他事务而言是不可见的。 因此,即使某个事务向表中添加了记录,在没有提交之前,其他事务也是看不到新添加的记录的
-
持久性(Durability)
持久性也可以称为耐久性,指的是在事务(无论是提交还是回滚)结束后,DBMS能够保证该时间点的数据状态会被保存的特性。即使由于系统故障导致数据丢失,数据库也一定能通过某种手段进行恢复。
如果不能保证持久性,即使是正常提交结束的事务,一旦发生了系统故障,也会导致数据丢失,一切都需要从头再来。
保证持久性的方法根据实现的不同而不同,其中最常见的就是将事务的执行记录保存到硬盘等存储介质中(该执行记录称为日志)。当发生故障时,可以通过日志恢复到故障发生前的状态。
-