oracle中constraint的使⽤,constraint⽤法总结I.
Oracle中的约束简单介绍
约束 Including Constraints
在数据库中使⽤约束(constraints)是为了在该数据库中实施所谓的"业务规则"其实就是防⽌⾮法信息进⼊数据库,满⾜管理员和应⽤开发⼈员所定义的规则集.
ORACLE使⽤完整性约束(integrity constraints)防⽌不合法的数据写⼊数据库,管理员和开发⼈员可以定义完整性规则,增强商业规则,限制数据表中的数据.如果⼀个DML语句执⾏的任何结果破坏了完整性约束,ORACLE就会回滚语句,返回错误信息.
约束是通过使⽤CREATE TABLE或ALTER TABLE语句⽣成的.(建⽴表时或者表建⽴后修改都可)如果相关的约束定义在单列上,可以在列这⼀级指定约束的定义;多列约束必须定义在数据表级,相关的列要在括号中指定,⽤逗号分隔.如果没有为约束提供⼀个名字,那么ORACLE会分配⼀个系统⽣成的唯⼀名字,以SYS_开头,你可以使⽤关键字CONSTRAINTS后⾯跟随相关的约束名字来为约束指定名字.
ORACLE⽀持五种类型的完整性约束
NOT NULL (⾮空)--防⽌NULL值进⼊指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.
CHECK (检查)--检查在约束中指定的条件是否得到了满⾜.
UNIQUE (唯⼀)--保证在指定的列中没有重复值.在该表中每⼀个值或者每⼀组值都将是唯⼀的.
PRIMARY KEY (主键)--⽤来唯⼀的标识出表的每⼀⾏,并且防⽌出现NULL值,⼀个表只能有⼀个主键约束.
POREIGN KEY (外部键)--通过使⽤公共列在表之间建⽴⼀种⽗⼦(parent-child)关系,在表上定义的外部键可以指向主键或者其他表的唯⼀键.
约束定义存储在数据字典中,查询USER_CONSTRAINTS可以获得相关信息.
定义约束
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);
<
CREATE TABLE employees
(employee_id NUMBER(6),
first_name VARCHAR2(20),
...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINTS emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));
列级的约束定义
column [CONSTRAINT constraint_name] constraint_type,
表级约束的定义
column,..
[CONSTRAINT constraint_name] constraint_type (column,...)
NOT NULL约束
只能定义在列级,不能定义在表级.
<
CREATE TABLE employees
(employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,//没有指定名字,将⽤系统SYS_命名
salary NUMBER(8,2),
foreign key references用法
commission_pct NUMBER(2,
hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL); //⽤户定义了名字
UNIQUE约束
⽤来保护⼀个表中的⼀个或者多个列没有任何两⾏在收到保护的列中具有重复的数据.ORACLE在唯⼀键列上⾃动⽣成⼀个唯⼀索引以实现唯⼀性
<
CREATE TABLE employees
(employee_id NUMBER(6),
salary NUMBER(8,
hire_date DATE NOT NULL,
CONSTRAINT emp_email_uk UNIQUE(email));
PRIMARY KEY约束
唯⼀键的所有特征都适⽤于主键约束,只是在主键列中不允许有NULL值.⼀个表只能有⼀个主键.
<
CREATE TABLE departments
(department_id NUMBER(4),
department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL,
manager_id NUMBER(6),
location_id NUMBER(4),
CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
FOREIGN KEY 约束
⽤来保护⼀个表中的⼀个或者多个列,它会通过⼀个主键主键或者唯⼀键保证对于每个⾮NULL值在数据库的其他地⽅都有⼀个数据可⽤.这个外部键就是在⽣成此约束的表(⼦表)中的⼀个或多个列,在⽗级表和⼦表中,相关列的数据类型必须匹配.外部键列和引⽤键(reference key)列可以位于相同的表中(
⾃引⽤完整性约束).
<
CREATE TABLE employees
(employee_id NUMBER(6),
deparment_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY(department_id) REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));
上例中是在表级定义外部键约束,如果在列级定义,不同的是:
CREATE TABLE employees
(...,
department_id NUMBER(4) CONSTRAINT emp_deptid_fk REFERENCES departments(department_id),
...);
//没有关键字FOREIGN KEY
FOREIGN KEY约束还有两个关键字是
ON DELETE CASCADE --当删除所引⽤的⽗表记录时,删除⼦表中相关的记录
ON DELETE SET NULL--与上⾯不同的是删除时,转换⼦表中相关记录为NULL值
默认情况下,如果没有指定以上两个中任⼀,则⽗表中被引⽤的记录将不能被删除.
CHECK 约束
[CONSTRAINT ] CHECK (
这⾥CHECK⼦句中的CONDITION应该求值为⼀个布尔值结果,并且可以引⽤相同⾏中其他列的值;不能包含⼦查询,序列,环境函数(SYSDATE,UID,USER,USERENV)和伪列(ROWNUM,LEVEL,CUR
RVAL,NEXTVAL),⼀个列上可以定义多个CHECK约束,如果所定义的条件为FALSE,则语句将回滚.
CREATE TABLE employees
(...,
salary NUMBER(8,2) CONSTRAINT emp_salary_min CHECK (salary>0),
...);
添加约束
ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id);
删除约束
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
ALTER TABLE departments
DROP PRIMARY KEY CASCADE; //由于departments被employees.department_id引⽤了
对于NOT NULL约束,⽤ALTER TABLE MODIFY⼦句来删除
ALTER TABLE employees MODIFY last_name NULL;
关闭约束
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk CASCADE; //如果没有被引⽤则不需CASCADE关键字
当你⽣成⼀个约束时,约束⾃动打开(除⾮你指定了DISABLE⼦句0,当⽤DISABLE关闭UNIQUE或者PRIMARY KEY约束时,ORACLE会⾃动删除相关的唯⼀索引,再次打开时,ORACLE⼜会⾃动建⽴的.
打开约束
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk; //注意,打开⼀个先前关闭的被引⽤的主键约束,并不能⾃动打开相关的外部键约束
可以从USER_CONSTRAINTS表和USER_CONS_COLUMNS视图中查询约束的信息
SELECT constraint_name,constraint_type,search_condition
FROM user_constraints
WHERE table_name='EMPLOYEES';
约束类型
C--CHECK和NOT NULL都算为C TYPE
P--PRIMARY KEY
R--REFERENTIAL INTEGRITY就是外部键约束
U--UNIQUE
SELECT constraint_name,column_name
FROM user_cons_columns
WHERE table_name='EMPLOYEES';
+++++++++++++++++++++++++
同学问⼀个sql语句,⾥⾯有constraint关键字,也把我弄糊涂了,我们两个都不懂,他说⾃⼰已经上⽹查了半个⼩时了,还没弄懂,真是⽯化了。我也上⽹了下,确实很不好理解,两篇⽐较有代表性的⽂章,慢慢研究琢磨。
这篇是从百度空间看到了,他也是转载的,但是没有写转载地址,所以我也不写了。版权归某位⼤神所有。
总结
如果觉得编程之家⽹站内容还不错,欢迎将编程之家⽹站推荐给程序员好友。
本图⽂内容来源于⽹友⽹络收集整理提供,作为学习参考使⽤,版权属于原作者。