
4.4 操作数据
SQL语句除了可以查询数据外,还可以完成插入、更新和删除数据等操作。在Oracle中创建表后,只有在表中插入数据之后,该表才有意义。如果表中的数据不合适,还可以对那些不合适的数据进行更新。如果某些数据已经不再需要,则可以删除这些数据。在操作数据的过程中,Oracle是通过各种事务来进行管理的。
4.4.1 插入数据
插入数据就是将数据放置到已经创建的表中,Oracle数据库通过INSERT语句来实现插入数据。一般情况下,使用INSERT语句可以一次插入一行数据。
与SELECT语句相比,INSERT语句的使用方式要简单得多。在INSERT语句的使用方式中,最为常用的形式是在INSERT INTO子句中指定添加数据的列,并在VALUES子句中为各个列提供一个值。
下面的语句将向SCOTT模式中的EMP表添加一条记录。

在向表中所有列添加数据时,可以省略INSERT INTO子句后的列表清单。使用这种方法时,必须根据表中定义的列的顺序,为所有的列提供数据,用户可以使用DESC命令查看表中定义列的顺序。下面的INSERT语句在向EMP表添加记录时省略了列清单。

在插入操作过程中,用户也可以根据实际情况只为部分列提供数据,而省略某些列的数据。注意这些列必须允许空值、有默认值或系统可以自动生成值等。例如,在EMP表中,除EMPNO列不允许空值外,其他列都可以为空值。
如果某个列不允许NULL值存在,而用户没有为该列提供数据,则会因为违反相应的约束而插入失败。事实上,在定义表的时候为了数据的完整性,经常会为表添加许多约束。例如,在EMP表中为了保证表中每条记录的唯一性,在表的EMPNO列上定义了主键约束。如果用户试图为表中的EMPNO列添加一个重复值,则会因为违反主键约束而失败。
SQL> insert into emp(empno,ename,job) 2 values(7782,'KING','CLERK'); insert into emp(empno,ename,job) * 第1行出现错误: ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP)
关于为表定义完整性约束,将在后面的章节中介绍,这里需要记住的是在向表添加记录时,添加的数据必须符合为表定义的所有完整性约束。
INSERT语句还有一种用法,可以实现一次向表中添加一组数据。即使用SELECT语句替换VALUES子句,这样由SELECT语句提供添加的数值。例如,下面的示例从EMP表提取属于某一部门的雇员信息并保存到另外一个表中。
SQL> create table accounting_employees( 2 empno number(4), 3 ename varchar2(10), 4 job varchar2(20), 5 hiredate date, 6 sal number(6,2)); 表已创建。 SQL> insert into accounting_employees 2 select empno,ename,job,hiredate,sal 3 from emp 4 where deptno=10; 已创建5行。
从上面的语句执行结果可以看出,通过使用INSERT和SELECT语句的组合,一次性为新创建的表添加了5行数据。
提示:
在使用INSERT和SELECT语句的组合成批添加数据时,INSERT INTO子句后所指定的列名可以与SELECT子句指定的列名不同,但是其数据类型必须相匹配,即SELECT语句返回的数据必须满足表中的约束。
4.4.2 更新数据
如果表中的数据不合适,则需要对其修改或更新。在SQL中,用户可以使用UPDATE语句完成数据的更新操作。
在更新数据时,既可以一次更新一列,也可以一次更新多列。如果在UPDATE语句中使用了WHERE条件表达式,那么只有符合条件的记录才会被更新;如果没有使用WHERE条件表达式,那么更新表中所有行的数据。
在更新表中的数据时,这些更新操作不能违反表中的完整性约束。例如,在EMP表中,主键列EMPNO的数据不允许重复,因此如果更新后的数据与现存数据相同,则会因为违反主键约束而失败。如下所示。
SQL> update emp 2 set empno=7876 3 where ename='CLARK'; update emp * 第1行出现错误: ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP)
提示:
在更新数据时,如果没有使用WHERE条件表达式,那么系统将会更新表中所有的数据。因此,在使用没有条件表达式的更新操作时一定要谨慎。
4.4.3 删除数据
如果表中的数据不再需要,那么就可以删除表中的数据。在删除表中的数据时,最常用的SQL语句是DELETE语句。
在删除操作中,既可以一次删除一行数据,也可以一次删除多行数据,更可以删除表中的所有数据。在DELETE语句中,如果没有使用WHERE条件表达式,那么将会删除表中的所有数据。例如,下面语句将删除EMP表中的ENAME列为ATG的记录行。
SQL> delete from emp 2 where ename='ATG'; 已删除1行。
在Oracle系统中,除了DELETE语句外,还可以使用TRUNCATE TABLE语句删除表中的所有数据。相比之下,使用TRUNCATE语句删除数据时,通常要比DELETE语句快得多。这是因为使用TRUNCATE TABLE语句删除数据时,它不会产生回退信息,因此执行TRUNCATE操作也不能撤销。例如,下面的语句将删除ACCOUNTING_EMPLOYEES表中所有的记录。
SQL> truncate table accounting_employees; 表被截断。
在用TRUNCATE语句删除数据时,还可以使用关键字REUSE STORAGE,表示删除记录后仍然保存记录占用的空间;与此相反,也可以使用DROP STORACE关键字,表示删除记录后立即回收记录占用的空间,默认在TRUNCATE TABLE语句中使用DROP STORAGE关键字。使用关键字REUSE STORAGE保留删除记录后的空间的TRUNCATE语句如下。
SQL> truncate table accounting_employees reuse storage; 表被截断。