Oracle约束

1.约束

作用:

约束用于确保数据库数据的完整性,在oracle数据库中,可以使用约束,触发器和应用代码(过程,函数)3种方法实现数据完整性,这3种方法中,因为约束易于维护,并且具有最好的性能,所以实现数据完整性首选约束.

分类:

约束的种类有:not null,unique,primary key,foreign key,check

Not null确保字段值不能为空

Unique:确保字段值唯一性

Primary key,最常用的约束(主键约束),主键约束的列值不仅不能重复,也不能为NULL,注意一张表最多只能有一个主键约束,当定义主键约束后oracle自动建立一个以主键为关键字段的索引。

Foreign key:定义了主从表之间的关系,foreign要定义在从表上,但主表必须具有主键约束或唯一约束,当定义froeign key后外部键列的数据必须在主表的主键列中存在,或者为NULL

Check::用于强制表行数据必须满足的条件,如工资表,工人工资必须在2000-5000之间

约束状态

enable validate:是默认,新旧数据同时满足约束规则

enable novalidate:旧数据可以不满足,检新插入的数据要满足约束

disable validate:不允许在表上执行任何DML操作,主要用在分区表,对于主键和唯一约事,会删除相应的唯一索引,但约束状态任可用

disable novalidate数据可不满足约束规则,对于主键和唯一约事,会删除相应的唯一索引,

约束常用语句

  1. create table t(i number,v mubmer not null)  
  2. create table t(i number,v mubmer unique)  
  3. create table t(i number constraint pk_i primary key,v number)  
  4. create table t2(c number,d number,constraint fk_d foreign key(c),references t1(v));  
  5. alter table t add constraint pk_i primary key (i)  
  6. alter table t modify i not null;  
  7. alter table t add constraint t_i unique(i)[(create index ind_name on t(i))];  
  8. alter table t add constraint t_i check(i in (1,2,3,4,5));  
  9. alter table t disable novalidate constraint i  
  10. alter table t enable novalidate constraint check_i  
  11. alter table t drop constraint i;  
  12. alter table t drop primary key i; 

#常用的数据字典

  1. dba_constraints  
  2. dba_cons_columns  
  3. user_cons_columns  
  4. user_constraints  

简单应用

检验当为一个表建立主键索时后,这个字段是否满足约束非空,唯一性,而且自动建立一个索引,并查看当把约束状态关闭再次插入相同的记录,是否还能把把约束设为enable ividate状态。

  1. SQL> create table t(i number constraint pk_i primary key,v number);  
  2. SQL> insert into t values(1,2);  
  3. SQL> insert into t values(3,4);  
  4. SQL> commit;  
  5. SQL> select * from t;  
  6.          I          V  
  7. ---------- ---------------------------  
  8.          1          2  
  9.          3          4  

现在表中有两条记录,然后给它插主键为空或相同的值

  1. SQL> insert into t values('',10);  
  2. ERROR at line 1:  
  3. ORA-01400: cannot insert NULL into ("Y"."T"."I")  
  4. SQL> insert into t values(1,10);  
  5. ERROR at line 1:  
  6. ORA-00001: unique constraint (Y.PK_I) violated  

可以看到全部报错,此时主键不能为空或重复

查看是否建立索引

  1. SQL> select index_name from user_indexes;  
  2. INDEX_NAME  
  3. ------------------------------  
  4. PK_I  

把约束关闭再次做同样的操用

  1. SQL> alter table t disable novalidate constraint pk_i;  
  2. Table altered.  
  3. SQL> insert into t values('',10);  
  4. 1 row created.  
  5. SQL> insert into t values(1,10);  
  6. 1 row created.  
  7. SQL> commit;  
  8. Commit complete.  
  9. SQL> select * from t;  
  10.          I          V  
  11. ---------- ----------  
  12.          1          2  
  13.          3          4  
  14.                    10  
  15.          1         10  
  16. SQL>  select index_name from user_indexes;  
  17. no rows selected  

可见当把约束关闭后就可以何意给表插数据了,而具索引也自动删除了。

现在激活约束

  1. SQL> alter table t enable validate constraint pk_i;  
  2. alter table t enable validate constraint pk_i  
  3. ERROR at line 1:  
  4. ORA-02437: cannot validate (SYS.PK_I) - primary key violated  

因为表中主键有相同的值所以不能恢复到enable validate状态了

再次测试回复到enable novalidate

  1. SQL> alter table t enable novalidate constraint pk_i;  
  2. alter table t enable validate constraint pk_i  
  3. ERROR at line 1:  
  4. ORA-02437: cannot validate (SYS.PK_I) - primary key violated  

也失败了,

因为表中主键有了空值和相同的值,所以恢复不到enable validate状态,但enable novalidate不检查旧数据所以应该还能恢复到enable novalidate.

要想恢复到enable novalidate必须建立主键索引(关闭约束时自动删除的那个索引)如下:

  1. SQL> create index pk_i on t(i);  
  2. Index created.  

然后恢复到enable disvalidate,以后再插数据不能为空,主键也不能重复了.

  1. SQL> alter table t enable novalidate constraint pk_i;  
  2. Table altered.  
  3. SQL> insert into t values(1,14);  
  4. insert into t values(1,14)  
  5. ERROR at line 1:  
  6. ORA-00001: unique constraint (SYS.PK_I) violated  

2.修正约束数据

当给一个表作主键约束时,因为已存数据不满足约束规则,会提示错误信息,些时必须对数据进行修正

要修正数据先找出不满足约束的数据

如下表,有不满足约束的数据

  1. SQL> select * from t;  
  2.          I          V  
  3. ---------- ------------------------  
  4.          1          2  
  5.          3          4  
  6.          15         12  
  7.          15         10  

如果一个表数据量多可通过如下方法查找

  1. SQL> alter table t drop constraint pk_i;    
  2. Table altered.  
  3. SQL>conn y / 123  
  4. SQL> @$ORACLE_HOME/rdbms/admin/utlexcpt.sql  
  5. Table created.  
  6. SQL> alter table t add constraint pk_i primary key (i) exceptions into exceptions;  
  7. select * from t where rowid in (select row_id from exceptions)  
  8.          I          V  
  9. ---------- ------------------------  
  10.          15         12  
  11.          15         10  

找到了重复的记录

修正

  1. SQL>update t set i=10 where v=12;  
  2. SQL> select * from t;  
  3.          I          V  
  4. ---------- ----------  
  5.          1          2  
  6.          3          4  
  7.          10         12  
  8.          15         10  

再建主键约束

  1. alter table t add constraint pk_i primary key (i)  
  2. Table altered.  
### Oracle 数据库中的约束Oracle数据库中,约束用于强制实施数据完整性规则。通过定义这些规则,可以确保输入到表中的数据满足特定条件,从而维护数据的一致性和准确性。 #### 主要的约束类型及其功能 1. **NOT NULL** 这种类型的约束防止列接受NULL值。一旦设置了此约束,在该列上不允许插入任何未指定的数据[^2]。 2. **UNIQUE** UNIQUE约束保证一列或多列组合中的所有值都是唯一的。这意味着在一个具有唯一键约束的字段里不能有两个相同的值存在。这有助于保持实体之间的关系不被破坏。 3. **PRIMARY KEY** PRIMARY KEY是由一个或多个非空(即带有 NOT NULL 属性)且唯一的列组成的特殊形式的UNIQUE约束。它用来唯一标识每一行记录,并作为其他表之间建立关联的基础。 4. **FOREIGN KEY** FOREIGN KEY约束指定了两个表间的关系,其中一个表称为父表而另一个为子表。外键通常指向另一张表里的主键或者候选键,以此来维持参照完整性。当尝试向子表添加新纪录时,如果对应的父表中不存在匹配项,则操作会被拒绝。 5. **CHECK** CHECK约束允许设定某些条件下才能插入或更新某列上的值。例如,可以通过设置年龄大于0这样的简单表达式来限定用户的出生日期范围;也可以更复杂地涉及多列间的逻辑运算。 #### 创建带约束的表格实例 下面给出了一些如何创建包含不同种类约束的新表的例子: ```sql CREATE TABLE employees ( employee_id NUMBER(6), first_name VARCHAR2(20), last_name VARCHAR2(25) CONSTRAINT emp_last_name_nn NOT NULL, email VARCHAR2(25) CONSTRAINT emp_email_uk UNIQUE, hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL, job_id VARCHAR2(10) CONSTRAINT emp_job_nn NOT NULL, salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), CONSTRAINT emp_salary_min CHECK (salary > 0), -- 检查工资必须大于零 CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id) ON DELETE SET NULL,-- 外部键引用部门表并设为空 CONSTRAINT pk_emp PRIMARY KEY(employee_id)-- 设置主键 ); ``` 上述SQL语句展示了怎样利用多种约束来构建一张名为`employees`的工作人员信息表单。这里包含了对姓名、电子邮件地址以及雇佣日期等属性施加的不同层次的要求,同时还建立了与其他相关联对象——比如部门——之间的联系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值