官术网_书友最值得收藏!

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;
      表被截斷。
主站蜘蛛池模板: 英吉沙县| 准格尔旗| 茶陵县| 胶州市| 长岛县| 静宁县| 夏津县| 多伦县| 普宁市| 疏附县| 甘洛县| 东乌| 衡南县| 高州市| 永定县| 五大连池市| 米易县| 当雄县| 新河县| 黎川县| 永泰县| 凤城市| 阳信县| 桦南县| 南平市| 大邑县| 休宁县| 乌恰县| 怀安县| 富顺县| 同德县| 清水河县| 昔阳县| 聂荣县| 黔西| 阳曲县| 铁力市| 安塞县| 克山县| 宝丰县| 义马市|