jonvi 发表于 2018-9-13 11:10:28

oracle check约束

  --创建一个简单的样例表
  HR@prod> create table emp as select employee_id,last_name,salary,department_id from employees;
  Table created.
  --创建一个简单视图
  HR@prod> create or replace view empvu
  2as
  3select * from emp
  4where department_id=20;
  View created.
  --通过视图插入一行数据
  HR@prod> insert into empvu values(500,'mary',5000,10);
  1 row created.
  --插入的数据最终会保存到基表
  HR@prod> select * from emp where employee_id=500;
  EMPLOYEE_ID LAST_NAME   SALARY DEPARTMENT_ID
  ----------- ------------------------- ---------- -------------
  500 mary       5000   10
  --但是视图里面查询不到,因为视图带有查询条件where department_id=20;
  HR@prod> select * from empvu;
  EMPLOYEE_ID LAST_NAME   SALARY DEPARTMENT_ID
  ----------- ------------------------- ---------- -------------
  201 Hartstein      13000   20
  202 Fay      6000   20
  --更新这个插入的数据,无法更新,因为视图里没有这个记录
  HR@prod> update empvu set salary=6000 where employee_id=500;
  0 rows updated.
  --删除这条记录,也无法删除,同样因为视图里面不包含这个记录
  HR@prod> delete from empvu where employee_id=500;
  0 rows deleted.
  --更新视图里包含的数据,可以正常更新
  HR@prod> update empvu set salary=salary+1 where employee_id=201;
  1 row updated.
  --同样,更新的结果反映到基表
  HR@prod> select * from emp where employee_id=201;
  EMPLOYEE_ID LAST_NAME   SALARY DEPARTMENT_ID
  ----------- ------------------------- ---------- -------------
  201 Hartstein      13001   20
  --删除视图里面包含的数据,同样可以实现
  HR@prod> delete from empvu where employee_id=201;
  1 row deleted.
  --删除的效果,同样反映到视图
  HR@prod> select * from empvu;
  EMPLOYEE_ID LAST_NAME   SALARY DEPARTMENT_ID
  ----------- ------------------------- ---------- -------------
  202 Fay      6000   20
  --基表当中,这个数据被删除
  HR@prod> select * from emp where employee_id=201;
  no rows selected
  --创建一个带有withc check option的视图
  HR@prod> create or replace view empvu20
  2as
  3select * from emp
  4where department_id=20
  5with check option constraint check_20;
  View created.
  --通过这个视图,想要插入一行记录
  HR@prod> insert into empvu20 values(501,'mike',5000,20);
  1 row created.
  ==插入的信息,是20号部门,所以可以操作;
  --插入一行记录,不是20号部门
  HR@prod> insert into empvu20 values(502,'rose',6000,10);
  insert into empvu20 values(502,'rose',6000,10)
  *
  ERROR at line 1:
  ORA-01402: view WITH CHECK OPTION where-clause violation

页: [1]
查看完整版本: oracle check约束