【OracleDB】 10 数据处理 DML

DML(Data Manipulation Language – 数据操纵语言) 

- 向表中插入数据

 

- 修改现存数据

- 删除现存数据

【事务是由完成若干项工作的DML语句组成的】


INSERT 语句语法

一次只能向表中插入一条数据

INSERT INTO    table [(column [, column...])]
VALUES        (value [, value...]);

 

插入数据

- 为每一列添加一个新值。

- 按列的默认顺序列出各个列的值。

- 在 INSERT 子句中随意列出列名和他们的值。

- 字符和日期型数据应包含在单引号中。

 

INSERT INTO departments(department_id, department_name, manager_id, location_id)
VALUES      (70, 'Public Relations', 100, 1700);

 

INSERT INTO employees(employee_id,last_name,email,hire_date,job_id)
VALUES  (300,’Tom’,’tom@126.com’,to_date(‘2012-3-21’,’yyyy-mm-dd’),’SA_RAP’);

 

插入空值

隐式方式: 在列名表中省略该列的值

INSERT INTO    departments (department_id, department_name    )
VALUES        (30, 'Purchasing');

显示方式: 在VALUES 子句中指定空值

INSERT INTO    departments
VALUES        (100, 'Finance', NULL, NULL);

插入指定的值

SYSDATE 记录当前系统的日期和时间

INSERT INTO 
    employees (employee_id, 
                 first_name, last_name, 
                 email, phone_number,
                 hire_date, job_id, salary, 
                 commission_pct, manager_id,
                 department_id)
VALUES           (113, 
                 'Louis', 'Popp', 
                 'LPOPP', '515.124.4567', 
                 SYSDATE, 'AC_ACCOUNT', 6900, 
                 NULL, 205, 100);

    

加入新员工

INSERT INTO employees
VALUES      (114, 
             'Den', 'Raphealy', 
             'DRAPHEAL', '515.127.4561',
             TO_DATE('FEB 3, 1999', 'MON DD, YYYY'),
             'AC_ACCOUNT', 11000, NULL, 100, 30);

 

创建脚本 

在SQL 语句中使用 & 变量指定列值。

& 变量放在VALUES子句中。

INSERT INTO departments 
    (department_id, department_name, location_id)
VALUES      
    (&department_id, '&department_name',&location);

 

从其它表中拷贝数据

INSERT 语句中加入子查询。

INSERT INTO emp2 
SELECT * 
FROM employees
WHERE department_id = 90;

不必书写 VALUES 子句。

子查询中的值列表应与 INSERT 子句中的列名对应

INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM   employees
WHERE  job_id LIKE '%REP%';

UPDATE  更新数据

语法公式:

UPDATE        table
SET        column = value [, column = value, ...]
[WHERE         condition];

【可以一次更新多条数据。】

 

使用 WHERE 子句指定需要更新的数据。

UPDATE employees
SET    department_id = 70
WHERE  employee_id = 113;

 

如果省略 WHERE 子句,则表中的所有数据都将被更新

UPDATE     copy_emp
SET        department_id = 110;

 

UPDATE 语句中使用子查询

更新 114号员工的工作和工资使其与205号员工 相同

UPDATE   employees
SET      job_id  = (SELECT  job_id 
                    FROM    employees 
                    WHERE   employee_id = 205), 
         salary  = (SELECT  salary 
                    FROM    employees 
                    WHERE   employee_id = 205) 
WHERE    employee_id    =  114;

调整与employee_id 为200的员工job_id相同的员工的department_id为employee_id为100的员工的department_id。

UPDATE  copy_emp
SET     department_id  =  (SELECT department_id
                           FROM employees
                           WHERE employee_id = 100)
WHERE   job_id         =  (SELECT job_id
                           FROM employees
                           WHERE employee_id = 200);

更新中的数据完整性错误

UPDATE employees
SET    department_id = 55
WHERE  department_id = 110;

错误提示不存在

ERROR at line 1:
ORA-02291: integrity constraint (HR.EMP_DEPT_FK) violated - parent key not found

样例2:

update employees set manager_id = 299 where employee_id = 203; 

DELETE 删除数据

语法公式

DELETE FROM      table
[WHERE      condition];

 

删除指定的记录行

DELETE FROM departments
 WHERE  department_name = 'Finance';

如果省略 WHERE 子句,则表中的全部数据将被删除

DELETE FROM  copy_emp;

 

DELETE 中使用子查询

使删除基于另一个表中的数据

DELETE FROM emp1
WHERE  department_id =
                       (SELECT department_id
                        FROM   dept1
                        WHERE  department_name LIKE '%Public%');

 

删除中的数据完整性错误

DELETE FROM departments
WHERE       department_id = 60;

具有外键关联的纪录行无法被删除

ERROR at line 1:
ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated - child record found

【You cannot delete a row that contains a primary key that is used as a foreign key in another table.】


数据库事务  DataBase Transaction

事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。

数据库事务由以下的部分组成:

- 一个或多个DML 语句

- 一个 DDL(Data Definition Language – 数据定义语言) 语句

- 一个 DCL(Data Control Language – 数据控制语言) 语句

 

COMMIT和ROLLBACK语句的优点

- 确保数据完整性。

- 数据改变被提交之前预览。

- 将逻辑上相关的操作分组。

 

 

回滚到保留点

使用 SAVEPOINT 语句在当前事务中创建保存点。

使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。

UPDATE...
SAVEPOINT update_done;
Savepoint created.
INSERT...
ROLLBACK TO update_done;
Rollback complete.

 

事务进程

自动提交在以下情况中执行:

- DDL 语句。

- DCL 语句。

- 不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话。

【会话异常结束 或 系统异常 会导致自动回滚】

提交或回滚前的数据状态

- 改变前的数据状态是可以恢复的

- 执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正

- 其他用户不能看到当前用户所做的改变,直到当前用户结束事务。

- DML语句所涉及到的行被锁定, 其他用户不能操作。

提交后的数据状态

- 数据的改变已经被保存到数据库中。

- 改变前的数据已经丢失。

- 所有用户可以看到结果。

- 锁被释放,其他用户可以操作涉及到的数据。

- 所有保存点被释放。

 

提交数据

DELETE FROM employees
WHERE  employee_id = 99999;
1 row deleted.

INSERT INTO departments 
VALUES (290, 'Corporate Tax', NULL, 1700);
1 row inserted.

提交改变

COMMIT;
Commit complete.

数据回滚后的状态

使用 ROLLBACK 语句可使数据变化失效:

- 数据改变被取消。

- 修改前的数据状态被恢复。

- 锁被释放。

DELETE FROM copy_emp;
22 rows deleted.
ROLLBACK;
Rollback complete.

 

 


 

posted @ 2020-05-15 16:49  emdzz  阅读(155)  评论(0)    收藏  举报