oracle 约束的状态

enable validate:是默认,新旧数据同时满足约束规则
enable novalidate:旧数据可以不满足,检新插入的数据要满足约束
disable validate:不允许在表上执行任何DML操作,主要用在分区表,对于主键和唯一约事,会删除相应的唯一索引,但约束状态任可用
disable novalidate数据可不满足约束规则,对于主键和唯一约事,会删除相应的唯一索引

=========================================================
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数据可不满足约束规则,对于主键和唯一约事,会删除相应的唯一索引,
  约束常用语句
  create table t(i number,v mubmer not null)
  create table t(i number,v mubmer unique)
  create table t(i number constraint pk_i primary key,v number)
  create table t2(c number,d number,constraint fk_d foreign key(c),references t1(v));
  alter table t add constraint pk_i primary key (i)
  alter table t modify i not null;
  alter table t add constraint t_i unique(i)[(create index ind_name on t(i))];
  alter table t add constraint t_i check(i in (1,2,3,4,5));
  alter table t disable novalidate constraint i
  alter table t enable novalidate constraint check_i
  alter table t drop constraint i;
  alter table t drop primary key i;
  #常用的数据字典
  dba_constraints
  dba_cons_columns
  user_cons_columns
  user_constraints
  简单应用
  检验当为一个表建立主键索时后,这个字段是否满足约束非空,唯一性,而且自动建立一个索引,并查看当把约束状态关闭再次插入相同的记录,是否还能把把约束设为enable ividate状态。
  SQL> create table t(i number constraint pk_i primary key,v number);
  SQL> insert into t values(1,2);
  SQL> insert into t values(3,4);
  SQL> commit;
  SQL> select * from t;
  I V
  ---------- ---------------------------
  1 2
  3 4
  现在表中有两条记录,然后给它插主键为空或相同的值
  SQL> insert into t values('',10);
  ERROR at line 1:
  ORA-01400: cannot insert NULL into ("Y"."T"."I")
  SQL> insert into t values(1,10);
  ERROR at line 1:
  ORA-00001: unique constraint (Y.PK_I) violated
  可以看到全部报错,此时主键不能为空或重复
  查看是否建立索引
  SQL> select index_name from user_indexes;
  INDEX_NAME
  ------------------------------
  PK_I
  把约束关闭再次做同样的操用
  SQL> alter table t disable novalidate constraint pk_i;
  Table altered.
  SQL> insert into t values('',10);
  1 row created.
  SQL> insert into t values(1,10);
  1 row created.
  SQL> commit;
  Commit complete.
  SQL> select * from t;
  I V
  ---------- ----------
  1 2
  3 4
  10
  110
  SQL> select index_name from user_indexes;
  no rows selected
  可见当把约束关闭后就可以何意给表插数据了,而具索引也自动删除了。
  现在激活约束
  SQL> alter table t enable validate constraint pk_i;
  alter table t enable validate constraint pk_i
  ERROR at line 1:
  ORA-02437: cannot validate (SYS.PK_I) - primary key violated
  因为表中主键有相同的值所以不能恢复到enable validate状态了
  再次测试回复到enable novalidate
  SQL> alter table t enable novalidate constraint pk_i;
  alter table t enable validate constraint pk_i
  ERROR at line 1:
  ORA-02437: cannot validate (SYS.PK_I) - primary key violated
  也失败了,
  因为表中主键有了空值和相同的值,所以恢复不到enable validate状态,但enable novalidate不检查旧数据所以应该还能恢复到enable novalidate.
  要想恢复到enable novalidate必须建立主键索引(关闭约束时自动删除的那个索引)如下:
  SQL> create index pk_i on t(i);
  Index created.
  然后恢复到enable disvalidate,以后再插数据不能为空,主键也不能重复了.
  SQL> alter table t enable novalidate constraint pk_i;
  Table altered.
  SQL> insert into t values(1,14);
  insert into t values(1,14)
  ERROR at line 1:
  ORA-00001: unique constraint (SYS.PK_I) violated
  2.修正约束数据
  当给一个表作主键约束时,因为已存数据不满足约束规则,会提示错误信息,些时必须对数据进行修正
  要修正数据先找出不满足约束的数据
  如下表,有不满足约束的数据
  SQL> select * from t;
  I V
  ---------- ------------------------
  1 2
  3 4
  1512
  15 10
  如果一个表数据量多可通过如下方法查找
  SQL> alter table t drop constraint pk_i;
  Table altered.
  SQL>conn y / 123
  SQL> @$ORACLE_HOME/rdbms/admin/utlexcpt.sql
  Table created.
  SQL> alter table t add constraint pk_i primary key (i) exceptions into exceptions;
  select * from t where rowid in (select row_id from exceptions)
  I V
  ---------- ------------------------
  1512
  1510
  找到了重复的记录
  修正
  SQL>update t set i=10 where v=12;
  SQL> select * from t;
  I       V
  ---------- ----------
  1       2
  3       4
  10       12
  15       10
  再建主键约束
  alter table t add constraint pk_i primary key (i)
  Table altered.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25380220/viewspace-701387/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25380220/viewspace-701387/

### Oracle 数据库约束的模式及使用方法 在 Oracle 数据库中,约束(Constraint)是一种用于确保数据完整性的机制。它可以通过定义规则来限制表中的数据值,从而保证数据库的一致性和可靠性。以下是关于 Oracle 数据库约束的模式和使用方法的详细介绍。 #### 1. 约束的类型 Oracle 数据库支持以下几种主要的约束类型: - **NOT NULL 约束**:指定列不能包含空值。 - 使用示例: ```sql CREATE TABLE employees ( id NUMBER CONSTRAINT emp_id_nn NOT NULL, name VARCHAR2(50) ); ``` 这里 `emp_id_nn` 是约束名称[^2]。 - **UNIQUE 约束**:确保列或一组列中的所有值都是唯一的,但允许空值。 - 使用示例: ```sql ALTER TABLE employees ADD CONSTRAINT emp_email_unique UNIQUE (email); ``` - **PRIMARY KEY 约束**:唯一标识表中的每一行,同时不允许空值。 - 使用示例: ```sql CREATE TABLE departments ( dept_id NUMBER CONSTRAINT dept_pk PRIMARY KEY, dept_name VARCHAR2(50) ); ``` - **FOREIGN KEY 约束**:建立表之间的关系,确保引用完整性。 - 使用示例: ```sql ALTER TABLE employees ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dept_id) REFERENCES departments(dept_id); ``` - **CHECK 约束**:限制列中可以存储的值范围。 - 使用示例: ```sql ALTER TABLE employees ADD CONSTRAINT emp_salary_check CHECK (salary > 0); ``` #### 2. 约束的模式 约束的模式与数据库模式密切相关。根据引用[^4],数据库模式是数据库管理员对可能应用程序的了解,并通过完整性约束来定义事实。约束作为模式的一部分,可以被定义在表或列级别上。 - **表级别约束**:适用于整个表,通常用于多列组合的约束。 - 示例: ```sql CREATE TABLE orders ( order_id NUMBER, product_id NUMBER, quantity NUMBER, CONSTRAINT order_pk PRIMARY KEY (order_id, product_id) ); ``` - **列级别约束**:仅适用于单个列。 - 示例: ```sql CREATE TABLE customers ( customer_id NUMBER CONSTRAINT cust_id_pk PRIMARY KEY, email VARCHAR2(100) CONSTRAINT cust_email_unique UNIQUE ); ``` #### 3. 约束的状态管理 约束可以处于不同的状态,包括启用(ENABLE)、禁用(DISABLE)、验证(VALIDATE)和未验证(NOVALIDATE)。这些状态可以通过 `ALTER TABLE` 语句进行管理。 - 启用并验证约束: ```sql ALTER TABLE employees ENABLE VALIDATE CONSTRAINT emp_salary_check; ``` - 禁用约束: ```sql ALTER TABLE employees DISABLE CONSTRAINT emp_salary_check; ``` #### 4. 约束的命名规范 为了便于维护和理解,建议为约束提供有意义的名称。如果未显式指定名称,Oracle 将自动生成一个系统名称。例如: ```sql CREATE TABLE projects ( project_id NUMBER CONSTRAINT proj_id_pk PRIMARY KEY, start_date DATE CONSTRAINT proj_start_nn NOT NULL ); ``` #### 5. 约束的作用域 约束可以在表空间中定义,并且其作用域与表空间相关联。根据引用[^5],表空间是 Oracle 数据库的逻辑存储结构,所有数据库对象都存储在表空间中。因此,约束的定义和使用也依赖于表空间的配置。 --- ### 示例代码 以下是一个完整的示例,展示如何在 Oracle 数据库中创建表并应用多种约束: ```sql CREATE TABLE employees ( employee_id NUMBER CONSTRAINT emp_id_pk PRIMARY KEY, first_name VARCHAR2(50) CONSTRAINT emp_fname_nn NOT NULL, last_name VARCHAR2(50) CONSTRAINT emp_lname_nn NOT NULL, email VARCHAR2(100) CONSTRAINT emp_email_unique UNIQUE, salary NUMBER CONSTRAINT emp_salary_check CHECK (salary > 0), department_id NUMBER CONSTRAINT emp_dept_fk FOREIGN KEY REFERENCES departments(department_id) ); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值