1Z0-051-DDL-表的约束
2016-06-29 10:34
288 查看
表的约束
表约束是数据库能够实施业务规则以及保证数据遵循实体-关系模型的一种手段。如果DML违法了约束,则将自动回滚整个语句。1.1 约束类型(1)UNIQUE 约束注:对于具有UNIQUE约束的列,可以插入多个包含NULL的行,而对于PRIMARYKEY约束而言,不能存在这种可能。(2)NOT NULL约束(3)PRIMARY KEY 约束注:UNIQUE和PRIMARY KEY 约束需要索引,如果不存在,就会自动予以创建。一张表只有一个主键。(4)CHECK 约束(5)FOREIGN KEY约束注:外键约束在子表上定义,但此时在父表上必须存在UNIQUE或primary key约束。一般而言,unique约束所有列以及foreign key 约束中的所有列最好也定义not null约束。 【问题】在字表中插入父表中没有匹配行的行,将发生错误,同样在父表中将在子表中已经存在的行删除,则删除相应的行将引发错误。【解决方案1】在创建约束是创建为ON DELETE CASCADE。 这意味着,如果删除父表中的行,那么Oracle将在子表中搜索索引匹配行,并删除它们。这将自动发生。【解决方案2】(此方案较温和)将约束创建为ONDELETE SET NULL.在这种情况下,如果删除父表中的行,Oracle将在子表中搜索索引匹配行,并将外键列设为空。 1.2 定义约束【案例】在创建表时定义约束 create table dept( 2 deptno number(2,0) not null constraint dept_deptno_pk primary key, 3 constraint dept_deptno_ck check (deptno between 10 and 90), 4 dname varchar2(20) constraint dept_dname_nn not null); Table created. SQL> alter tableemp rename to emp1; Table altered. SQL> create tableemp( 2 empno number(4,0) not null constraint emp_empno_pk primary key, 3 ename varchar2(20) constraint emp_ename_nn not null, 4 mgrnumber(4,0) constraint emp_mgr_fk references emp(empno), 5 dobdate, 6 hiredate date, 7 deptno number(2,0) constraint emp_deptno_fk references dept(deptno) 8 ondelete set null, 9 email varchar2(30) constraint emp_email_uk unique, 10 constraint emp_hiredate_ck check(hiredate >=dob +365*16), 11 constraint emp_email_ck 12 check((instr(email,'@') > 0) and (instr(email,'.') > 0))); Table created. 1.3 约束状态任何时候,约束都处于启用或禁用状态,验证或非验证状态。ENABLE VALIDATE 无法输入违反约束的行,而且表中的所有行都符合约束。(理想情况,默认)
DISABLE NOVALIDATE 可以输入任何数据(无论是否符合要求),表中可能已经存在不符合要求的数据。(批量导入数据时)
ENABLE NOVALIDATE 表中可能已经存在不符合要求的数据,但现在输入的所有数据必须符合要求。
DISABLE VALIDATE 这种情况不存在
SQL> alter tableemp modify constraint emp_ename_nn disable novalidate; Table altered. SQL> insert intoemp select * from emp1; SQL> alter tableemp modify constraint emp_ename_nn enable novalidate; Table altered. SQL>update empset ename = 'NOT KNOWN' where ename is null; SQL> alter tableemp modify constraint emp_ename_nn enable validate; Table altered. 1.4 约束检查 可以在执行语句是检查约束(IMMEDIATE 约束)或者提交事务是检查约束(DEFERRED约束)。默认情况下,所有约束都是IMMEDIATE约束,不能延迟。将上例子中的代替方法将约束创建为DEFERRED(延迟)约束。SQL> setconstraint emp_ename_nn deferred;SQL> insert intoemp select * from emp1;SQL>update empset ename = 'NOT KNOWN' where ename is null;SQL>commit;SQL>set constraint emp_ename_nn immediate; 要使约束成为延迟约束,必须使用适当方法进行创建。SQL>alter table emp add constraint emp_ename_nn check(ename is not null) deferrable initiallyimmediate; 2Table altered. 此时重新执行约束延迟才能成功。SQL> setconstraint nn_emp_ename deferred;Constraint set. SQL> insert intoemp select * from emp1;SQL>update empset ename = 'NOT KNOWN' where ename is null;SQL>commit; SQL> setconstraint nn_emp_ename immediate;Constraint set. (1)查找约束的名称 SQL> selectconstraint_name,constraint_type,column_name 2 fromuser_constraints natural join user_cons_columns 3 where table_name ='&Table'; (2)修改约束名称Altertable emp rename constraint old_name tonew_name; (3)向webstore模式中添加如下约束SQL>alter table orders add constraint pk_order_id primary key(order_id);SQL>alter table products add constraint pk_product_id primarykey(product_id);SQL>alter table order_items add constraint fk_product_id foreignkey(product_id) references products(product_id);SQL>alter table order_items add constraint fk_order_id foreign key(order_id) references orders(order_id);SQL>alter table orders add constraint fk_customer_id foreignkey(customer_id) references customers(customer_id);
表约束是数据库能够实施业务规则以及保证数据遵循实体-关系模型的一种手段。如果DML违法了约束,则将自动回滚整个语句。1.1 约束类型(1)UNIQUE 约束注:对于具有UNIQUE约束的列,可以插入多个包含NULL的行,而对于PRIMARYKEY约束而言,不能存在这种可能。(2)NOT NULL约束(3)PRIMARY KEY 约束注:UNIQUE和PRIMARY KEY 约束需要索引,如果不存在,就会自动予以创建。一张表只有一个主键。(4)CHECK 约束(5)FOREIGN KEY约束注:外键约束在子表上定义,但此时在父表上必须存在UNIQUE或primary key约束。一般而言,unique约束所有列以及foreign key 约束中的所有列最好也定义not null约束。 【问题】在字表中插入父表中没有匹配行的行,将发生错误,同样在父表中将在子表中已经存在的行删除,则删除相应的行将引发错误。【解决方案1】在创建约束是创建为ON DELETE CASCADE。 这意味着,如果删除父表中的行,那么Oracle将在子表中搜索索引匹配行,并删除它们。这将自动发生。【解决方案2】(此方案较温和)将约束创建为ONDELETE SET NULL.在这种情况下,如果删除父表中的行,Oracle将在子表中搜索索引匹配行,并将外键列设为空。 1.2 定义约束【案例】在创建表时定义约束 create table dept( 2 deptno number(2,0) not null constraint dept_deptno_pk primary key, 3 constraint dept_deptno_ck check (deptno between 10 and 90), 4 dname varchar2(20) constraint dept_dname_nn not null); Table created. SQL> alter tableemp rename to emp1; Table altered. SQL> create tableemp( 2 empno number(4,0) not null constraint emp_empno_pk primary key, 3 ename varchar2(20) constraint emp_ename_nn not null, 4 mgrnumber(4,0) constraint emp_mgr_fk references emp(empno), 5 dobdate, 6 hiredate date, 7 deptno number(2,0) constraint emp_deptno_fk references dept(deptno) 8 ondelete set null, 9 email varchar2(30) constraint emp_email_uk unique, 10 constraint emp_hiredate_ck check(hiredate >=dob +365*16), 11 constraint emp_email_ck 12 check((instr(email,'@') > 0) and (instr(email,'.') > 0))); Table created. 1.3 约束状态任何时候,约束都处于启用或禁用状态,验证或非验证状态。ENABLE VALIDATE 无法输入违反约束的行,而且表中的所有行都符合约束。(理想情况,默认)
DISABLE NOVALIDATE 可以输入任何数据(无论是否符合要求),表中可能已经存在不符合要求的数据。(批量导入数据时)
ENABLE NOVALIDATE 表中可能已经存在不符合要求的数据,但现在输入的所有数据必须符合要求。
DISABLE VALIDATE 这种情况不存在
SQL> alter tableemp modify constraint emp_ename_nn disable novalidate; Table altered. SQL> insert intoemp select * from emp1; SQL> alter tableemp modify constraint emp_ename_nn enable novalidate; Table altered. SQL>update empset ename = 'NOT KNOWN' where ename is null; SQL> alter tableemp modify constraint emp_ename_nn enable validate; Table altered. 1.4 约束检查 可以在执行语句是检查约束(IMMEDIATE 约束)或者提交事务是检查约束(DEFERRED约束)。默认情况下,所有约束都是IMMEDIATE约束,不能延迟。将上例子中的代替方法将约束创建为DEFERRED(延迟)约束。SQL> setconstraint emp_ename_nn deferred;SQL> insert intoemp select * from emp1;SQL>update empset ename = 'NOT KNOWN' where ename is null;SQL>commit;SQL>set constraint emp_ename_nn immediate; 要使约束成为延迟约束,必须使用适当方法进行创建。SQL>alter table emp add constraint emp_ename_nn check(ename is not null) deferrable initiallyimmediate; 2Table altered. 此时重新执行约束延迟才能成功。SQL> setconstraint nn_emp_ename deferred;Constraint set. SQL> insert intoemp select * from emp1;SQL>update empset ename = 'NOT KNOWN' where ename is null;SQL>commit; SQL> setconstraint nn_emp_ename immediate;Constraint set. (1)查找约束的名称 SQL> selectconstraint_name,constraint_type,column_name 2 fromuser_constraints natural join user_cons_columns 3 where table_name ='&Table'; (2)修改约束名称Altertable emp rename constraint old_name tonew_name; (3)向webstore模式中添加如下约束SQL>alter table orders add constraint pk_order_id primary key(order_id);SQL>alter table products add constraint pk_product_id primarykey(product_id);SQL>alter table order_items add constraint fk_product_id foreignkey(product_id) references products(product_id);SQL>alter table order_items add constraint fk_order_id foreign key(order_id) references orders(order_id);SQL>alter table orders add constraint fk_customer_id foreignkey(customer_id) references customers(customer_id);
相关文章推荐
- SQLserver删除某数据库中所有表实现思路
- 基于unique与primary约束的区别分析
- SQLite 入门教程三 好多约束 Constraints
- MySQL学习笔记4:完整性约束限制字段
- mysql创建Bitmap_Join_Indexes中的约束与索引
- sql server建库、建表、建约束技巧
- SQL Server创建数据库和数据表的相关约束实现方法
- SQLSERVER实现更改表名,更改列名,更改约束代码
- Oracle 基础篇 --- 约束
- 约束类型介绍以及使用整理
- 在linux上使用yum安装JDK
- linux下大于2TB硬盘parted 分区
- Mysql与Couchbase之区别!!
- 主键,外键,索引,唯一索引
- ORACLE SQL 约束
- ORACLE 管理 约束与字符集
- linux新增磁盘分区时出现问题-150
- oracle 建立外键 此列列表的唯一关键字或主键不匹配 解决办法
- 网络设计之一PVLAN
- PostgreSQL数据库日常学习笔记13-约束