您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Oracle DB约束概览_MySQL

2024/3/28 9:02:59发布31次查看
bitscn.com
oracle db约束概览
• 约束条件用于在表级别强制执行各种规则。
• 约束条件用于防止在存在相关性时删除表。
• 下列约束条件类型有效:
– not null :指定该列不能包含空值
– unique :定一个列或列组合的值对于表中的所有行必须是唯一的
– primary key :唯一地标识表中的每一行
– foreign key :在该列和所引用表的列之间建立联系后强制实施引用完整性,这样其中一个表的值与另一个表中的值相匹配
– check :指定必须为真的条件
oracle server 使用约束条件来防止将无效的数据输入到表中。
可以使用约束条件完成以下任务:
• 在表中插入、更新或删除某一行时,对表中的数据强制执行各种规则。必须满足约束条件,操作才会成功。
• 防止当某个表与其它表存在相关性时删除该表。
• 为oracle 工具(例如oracle developer)提供规则。
约束条件准则
• 可以为约束条件命名,也可以由oracle server 使用sys_cn格式生成一个名称。
• 可采用以下任何一种方式创建约束条件:
– 创建表的同时创建约束条件
– 创建表以后
• 可以在列或表级别定义约束条件。
• 可以在数据字典中查看约束条件。
所有约束条件都存储在数据字典中。如果为约束条件指定了一个有意义的名称,则引用时较为容易。约束条件名称必须遵循标准对象命名规则,但是该名称不能与同一用户的另一对象名称相同。如果你没有对约束条件命名,oracle server 就会按照sys_cn格式生成一个名称,其中n是一个整数,这样约束条件名称是唯一的。
既可以在创建表的同时定义约束条件,也可以在创建表之后定义约束条件。
你可以在列级别或表级别定义约束条件。从功能上来说,表级别约束条件与列级别约束条件的作用是相同的。
定义约束条件
• 语法:
create table [schema.]table
(column datatype[default expr] 
[column_constraint],
... 
[table_constraint][,...]);
• 列级别约束条件语法:
column[constraint constraint_name] constraint_type,
• 表级别约束条件语法:
column,... 
[constraint constraint_name] constraint_type
(column, ...),
示例给出了在创建表时定义约束条件的语法。你可以在列级别或表级别创建约束条件。
定义列时会包括在列级别定义的约束条件。在表定义结束时定义表级别约束条件,必须在一组括号中引用应用了约束条件的列或列组合。这二者主要在语法上有所不同;此外从功能上来说,列级别约束条件和表级别约束条件的作用是相同的。
必须在列级别定义not null约束条件。
必须在表级别定义适用于多个列的约束条件。
在该语法中:
schema :与所有者的姓名相同
table :是表名称
default expr :指定当insert语句中省略了值时所使用的默认值
column: 是列名称
datatype :是列的数据类型和长度
column_constraint:是作为列定义一部分的完整性约束条件
table_constraint :是作为表定义一部分的完整性约束条件
• 列级别约束条件示例:
create table employees(
employee_id number(6) constraint emp_emp_id_pk primary key,
first_name  varchar2(20),
...);
• 表级别约束条件示例:
create table employees(
employee_id number(6),
first_name  varchar2(20),
...
job_id varchar2(10) not null,
constraint emp_emp_id_pk primary key (employee_id));
通常会在创建表的同时创建约束条件。可以在创建表之后将约束条件添加到表,也可以临时禁用约束条件。
示例中都对employees表的employee_id列创建了主键约束条件。
1.第一个示例使用列级别语法定义约束条件。
2.第二个示例使用表级别语法定义约束条件。
not null约束条件
not null约束条件可以确保某列不包含空值。默认情况下,没有not null约束条件的列可以包含空值。
必须在列级别定义not null约束条件。
在employees表中,employee_id列继承了not null约束条件,因为该列已定义为主键。否则,在last_name、email、hire_date和job_id列上强制实施not null约束条件。
unique约束条件
unique关键字完整性约束条件要求一列或一组列(键)中的每个值必须是唯一的,即在指定的列或一组列中,表的任意两行无重复值。unique关键字约束条件的定义中包括的列(或一组列)被称为唯一关键字。如果unique约束条件由多个列组成,则该组列被称为组合唯一关键字。
unique约束条件允许输入空值,除非你还为同一列定义了not null约束条件。实际上,因为空值被认为不等于任何值,所以任意数量的行都可以在没有not null约束条件的列中包括空值。一个列(或组合unique关键字的所有列)中的空值总是满足unique约束条件。
注:由于多个列上unique约束条件的搜索机制所致,在部分空值组合unique关键字约束条件的非空列中不能有相同的值。
可以在表级别或列级别定义:
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, 
... 
constraint emp_email_uk unique(email)); 
可以在列级别或表级别定义unique约束条件。如果要创建一个组合唯一关键字,则可在表级别定义该约束条件。如果不能使用单个属性来唯一地标识某一行,则需定义组合关键字。在这种情况下,可以创建由两个或两个以上列组成的唯一关键字,其组合值总是唯一的,可用于标识行。
示例中将unique约束条件应用于employees表的email列。该约束条件的名称为emp_email_uk。
注:oracle server 通过对一个或多个唯一关键字列隐式创建一个唯一索引来强制实现unique约束条件。
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> /
owner      table_name                     column_nam constraint_name                c search_condition
---------- ------------------------------ ---------- ------------------------------ - --------------------
hr         employees                      salary             emp_salary_min                     c     salary > 0
hr         employees                      email              emp_email_uk                       u
hr         employees                      employee_id     emp_emp_id_pk                  p                                        
hr         employees                      department_id emp_dept_fk                        r                                   
hr         employees                      job_id            emp_job_fk                                 r
hr         employees                      manager_id     emp_manager_fk                 r
hr         employees                      last_name      emp_last_name_nn               c     last_name is not null
hr         employees                      email              emp_email_nn                       c         email is not null
hr         employees                      hire_date      emp_hire_date_nn               c     hire_date is not null
hr         employees                      job_id             emp_job_nn                             c                 job_id is not null
10 rows selected.
违反约束条件
当对列设置了约束条件后,如果试图违反约束条件规则,则会返回一条错误。例如,如果尝试更新一条记录,但该记录中的值受完整性约束条件所约束,则会返回一条错误。示例中,因为父表departments中不存在部门55,所以你会收到违例ora-02291“parent key not found(未找到父关键字)”。
hr@test0924> update employees set department_id=55 where department_id=110;
update employees set department_id=55 where department_id=110
*
error at line 1:
ora-02291: integrity constraint (hr.emp_dept_fk) violated - parent key not found
如果某行中包含用作其它表中的外键的主键,则不能删除该行。
hr@test0924> delete from departments where department_id=60;
delete from departments where department_id=60
*
error at line 1:
ora-02292: integrity constraint (hr.emp_dept_fk) violated - child record found
如果试图删除一条记录,但该记录中的值受完整性约束条件所约束,则会返回一条错误。
示例中试图从departments表中删除部门60,但此操作导致一个错误,因为该部门编号已用作employees表中的外键。如果试图删除具有子记录的父记录,则会收到违例ora-02292“child record found(存在子记录)”。
由于部门210 中没有任何雇员,因此下面的语句有效:
hr@test0924> delete from departments where department_id=210;
1 row deleted.
bitscn.com
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product