Oracle DB约束概览(二)

2014-11-24 09:03:20 · 作者: · 浏览: 4
UE约束条件。
PRIMARY KEY约束条件
PRIMARY KEY约束条件用于创建创建表的主键。只能为每一个表创建一个主键。
PRIMARY KEY约束条件是唯一标识表中每一行的一个列或一组列。此约束条件可以强制一个列或列组合是唯一的,还可以确保作为主键一部分的列不包含空值。
注:因为唯一性是主键约束条件定义的一部分,所以Oracle Server 通过对一个或多个主键列隐式创建一个唯一索引来强制实现唯一性。
FOREIGN KEY约束条件
FOREIGN KEY(或引用完整性)约束条件指定一个列或列组合作为外键,并建立与同一表或不同表中主键或唯一关键字的关系。
示例中,DEPARTMENT_ID已被定义为EMPLOYEES表(相关表或子表)中的外键,它引用DEPARTMENTS表(被引用表或父表)的DEPARTMENT_ID列。
准则
外键值必须与父表中的现有值相匹配,或为NULL。
外键取决于数据值,外键是纯逻辑指针,而不是物理指针。
可以在表级别或列级别定义:
CREATE TABLE employees(
employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
...
department_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));
可以在列级别或表级别定义FOREIGN KEY约束条件。必须使用表级别定义来创建组合外键。
示例中使用表级别语法,对EMPLOYEES表的DEPARTMENT_ID列定义一个FOREIGN KEY约束条件。该约束条件的名称为EMP_DEPT_FK。
如果约束条件只是针对单个列,则也可以在列级别定义外键。语法上的不同之处在于没有出现关键字FOREIGN KEY。例如:
CREATE TABLE employees
(...
department_id NUMBER(4) CONSTRAINT emp_deptid_fk
REFERENCES departments(department_id),
...
)
FOREIGN KEY约束条件:关键字
外键是在子表中定义的,而包含被引用列的表是父表。外键是使用以下关键字的组合定义的:
FOREIGN KEY用于在表约束条件级别定义子表中的列。
REFERENCES用于标识父表中的表和列。
ON DELETE CASCADE指出在删除父表中的行时,还删除子表中的相关行。
ON DELETE SET NULL指出在删除父表中的行时,将外键值设为空值。
默认行为被称为限制规则,该规则可禁止更新或禁止删除被引用的数据。
在没有ON DELETE CASCADE或ON DELETE SET NULL选项时,如果在子表中引用父表中的一行,则不能删除该行。
CHECK约束条件
定义每行都必须满足的一个条件
以下表达式是不允许的:
– 引用CURRVAL、NEXTVAL、LEVEL和ROWNUM假列的表达式
– 调用SYSDATE、UID、USER和USERENV函数的表达式
– 引用其它行中的其它值的查询
..., salary NUMBER(2)
CONSTRAINT emp_salary_min CHECK (salary> 0),...
CHECK约束条件用于定义每行都必须满足的一个条件。该条件可以使用与查询条件相同的结构,但是以下项除外:
引用CURRVAL、NEXTVAL、LEVEL和ROWNUM假列的表达式
调用SYSDATE、UID、USER和USERENV函数的表达式
引用其它行中的其它值的查询
一个列可以有多个CHECK约束条件,这些约束条件将在其定义中引用该列。可以按需要,对一个列定义任意数量的CHECK约束条件。
可以在列级别或表级别定义CHECK约束条件。
CREATE TABLE employees
(...
salary NUMBER(8,2) CONSTRAINT emp_salary_min CHECK (salary > 0),
...
示例中显示用于创建HR方案中EMPLOYEES表的语句
CREATE TABLE employees
( employee_id NUMBER(6)
CONSTRAINT emp_employee_id PRIMARY KEY
, first_name VARCHAR2(20)
, last_name VARCHAR2(25)
CONSTRAINT emp_last_name_nn NOT NULL
, email VARCHAR2(25)
CONSTRAINT emp_email_nn NOT NULL
CONSTRAINT emp_email_uk UNIQUE
, phone_number VARCHAR2(20)
, hire_date DATE
CONSTRAINT emp_hire_date_nn NOT NULL
, job_id VARCHAR2(10)
CONSTRAINT emp_job_nn NOT NULL
, salary NUMBER(8,2)
CONSTRAINT emp_salary_ck CHECK (salary>0)
, commission_pct NUMBER(2,2)
, manager_id NUMBER(6)
CONSTRAINT emp_manager_fk REFERENCES
employees (employee_id)
, department_id NUMBER(4)
CONSTRAINT emp_dept_fk REFERENCES
departments (department_id));
通过以下查询表中哪列有哪些约束,上面创建表的语句对应下面的约束。
hr@TEST0924> l
1 select a.owner,a.TABLE_NAME,b.COLUMN_NAME,a.CONSTRAINT_NAME,a.CONSTRAINT_TYPE,a.SEARCH_CONDITION
2 from USER_CONSTRAINTS a,USER_CONS_COLUMNS b
3* where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and A.table_name='EMPLOYEES'
hr@TEST0924> /
OWN