1Z0-051-DDL-表的约束
admin
2023-06-08 21:21:33
0次


表的约束

表约束是数据库能够实施业务规则以及保证数据遵循实体-关系模型的一种手段。如果

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;

  2

Table 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);


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...