当前位置:数据库 > Oracle >>

Oracle约束操作

Oracle约束操作
 
约束是在表中定义的用于维护数据库完整性的一些规则。通过为表中的字段定义约
束,可以防止将错误的数据插入到表中。
注意:
1.如果某个约束只作用于单独的字段,既可以在字段级定义约束,也可以在表级定义约束;但如果某个约束将作用于多个字段,必须在表级定义约束。
2.oracle中的约束通过名称来进行识别。在定义约束时可以通过constraint关键字为约束命名。如果用户没有为约束指定名称,oracle将自动为约束建立默认的名称。
主键约束(primary key):
主键约束的特点:
 定义为主键约束的字段中不能包含任何重复值,并且不能包含null值。
 同1个表中只能定义1个主键约束。
 可以为一个字段定义主键约束,也可以为多个字段的组合定义主键约束。
 oracle会自动为具有主键约束的字段建立1个唯一索引和1个非空约束。
例如:
 create table person
 (
       p_id int primary key,        --定义该字段为主键约束
       p_name varchar2(20),
       p_age int
   --constraint p_pk primary key (p1_id)
 );
create table person
(
       p_id int constraint p_pk primary key,    --定义该字段为主键约束,并指定约束名字
       p_name varchar2(20),
       p_age int
      --constraint p_pk primary key (p1_id)
);
create table person
(
       p_id int,
       p_name varchar2(20),
       p_age int,
       constraint p_pk primary key (p_id,p_name)--定义复合主键,并指定名字
      --primary key(p_id,p_name)
);
 
非空约束(not null):
非空约束的特点:
 定义了非空约束的字段中不能包含null值。
 只能在字段级定义非空约束。
 在同一个表中可以定义多个非空约束。
例如:
create table person
(
       p_id int,
       p_name varchar2(20) not null, --定义该列的非空约束
       p_age int
 );
 
唯一约束(unique):
唯一约束的特点:
 定义了唯一约束的字段中不能包含重复值。
 可以为1个字段定义唯一约束,也可以为多个字段的组合定义唯一约束。因此,唯一约束既可以定义在字段级,也可以定义在表级。
 oracle会自动为具有唯一约束的字段建立1个唯一索引。
 对同一字段可以同时定义非空和唯一约束。
 如果在1个字段上仅定义了唯一约束,而没有定义非空约束,则该字段可以包含多个null值。
例如:
create table person
(
       p_id int,
       p_name varchar2(20) unique,--定义该列的唯一约束
       p_age int
);
create table person
(
       p_id int,
       p_name varchar2(20) constraint p_un unique not null, --同时定义唯一和非空约束
       p_age int
);
create table person
(
       p_id int,
       p_name varchar2(20),
       p_age int,
       constraint p_un unique(p_name) --指定约束名字
);
 
外键约束(foreign key)
 外键约束的特点:
  定义为外键约束的字段中只能包含相应的其他表中引用字段的值或null值。
  可以为1个字段定义外键约束,也可以为多个字段的组合定义外键约束。
  定义了外键约束的字段和相应的引用字段可以存在于同1个表中,称为自引用。
  对同1个字段可以同时定义外键和非空约束。
  主表中的被引用列,必须有主键约束或唯一约束。
例如:
 create table person
 (
       p_id int,
       p_name varchar2(20),
       p_age int,
       w_id int,
       constraint p_fk foreign key (w_id) references works(w_id)            --外键约束
  );
 create table person
      (
       p_id int,
       p_name varchar2(20),
       p_age int,
       w_id int constraint p_fk references works-- 外键约束,引用works表中的主键
  );
create table person
 (
       p_id int,
       p_name varchar2(20),
       p_age int,
       w_id int references works       --外键约束
  -- w_id int constraint w_fk references works(w_id)
  );
在定义外键约束时,还可以通过on关键字来指定引用行为的类型。当主表中的一条记录被删除时,需要通过引用行为来确定如何处理子表中的外键列的值。
删除子表中所有相关的记录(delete cascade),
将所有相关记录的外键值设置为null(delete set null)
检查约束(check)
 检查约束的特点:
  在检查约束的表达式中必须引用到表中的一个或多个字段,并且表达式的计算结果必须是一个布尔值。
  在表达式中不能包含子查询。
  在表达式中不能包含sysdate,uid,user,userenv等sql函数,也不能包含rowid,rownum等伪列。
  检查约束可以在字段级和表级定义。
  对同一个字段可以定义多个检查约束,而且对同一个字段可以同时定义检查约束和非空约束。
例如:
  create table person
(
       p_id int,
       p_name varchar2(20),
       p_age int check(p_age > 20)   --检查约束
    -- constraint p_check check(p_age > 20)      --检查约束
);
  create table person
(
       p_id int,
       p_name varchar2(20),
       p_age int constraint p_check check(p_age > 20)  --检查约束
     -- constraint p_check check(p_age > 20)      --检查约束
);
 
增加约束
如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;
如果增加NOT NULL约束,那么必须使用ALTER TABLE语句的MODIFY子句,如:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
constraint_type (column,...)
ALTER TABLE table_name MODIFY column
[CONSTRAINT constraint_name] NOT NULL;
 
添加外键约束
alter table emp add foreign key (deptno) references dept(deptno);
alter table emp add constraint d_fk foreign key (deptno) references dept(deptno);
添加主键约束
 alter table table_name add primary key(column_name);
alter table table_name add constraint t_pk primary key(column_name);
添加非空约束
alter table person modify p_name not null;
alter table person modify p_name constraint t_notnull not null;
约束延迟(在事务提交时再验证,默认为不延迟)
 deferrable --延迟验证
 not defe
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,