搜档网
当前位置:搜档网 › oracle约束的添加

oracle约束的添加


(就是说如果一个约束约束的是两个列或者是两个以上的话,就要将该约束创建为表级别的约束)


方法一:
Create table 表名(字段1 字段1类型 Primary Key,字段2 字段2类型,..字段N 字段N类型);
Create table UserInfo(UserID varchar2(20) Primary Key,UserPassWord varchar(20),StateID number);
方法二:
Alter table 表名 add constraint 约束名 Primary Key(字段1);
Create table UserInfo(UserID varchar2(20),UserPassWord varchar(20),StateID number);
Alter table UserInfo add constraint PK_UserInfo Primary Key(UserID); 外键约束的添加-------->>>>


方法一:
Create table 表名(字段1 字段1类型,字段2 字段2类型 constraint 约束名 references 外键表名(外键),..字段N 字段N类型);
Create table UserInfo(UserID varchar2(20),UserPassWord varchar(20),StateID number constraint FK_UserInfoState references State(StateID));
(注:在此之前我们必须先创建好State表)-Create table State (StateID number primary key,StateName varchar2(20));
方法二:
Alter table 外键表 add constraint 约束名 Foreign Key(外键表中的外键) references 主键表名(主键表中的主键);
Create table UserInfo(UserID varchar2(20) Primary Key,UserPassWord varchar2(20),StateID number);
Create table State (StateID number primary key,StateName varchar2(20));
Alter table UserInfo add constraint FK_UserInfoState Foreign Key(StateID) references State(StateID);


非空约束的添加非空约束的添加非空约束的添加非空约束的添加-------->>>>


方法一:Create table 表名(字段1 字段1类型,字段2 字段2类型 constraint 约束名 not null,..字段N 字段N类型);
Create table UserInfo(UserID varchar2(20),UserPassWord varchar2(20) constraint N_UserPassWord not null,StateID number);
方法二:Alter table 表名 modify (字段名 not null);
Create table UserInfo(UserID varchar2(20),UserPassWord varchar2(20),StateID number);
Alter table UserInfo modify(UserPassWord not null);
唯一约束的添加唯一约束的添加唯一约束的添加唯一约束的添加-------->>>>
方法一:
Create table 表名(字段1 字段类型1,字段2 字段类型2 constraint 约束名 Unique,字段n 字段类型n);
Create table dog(dogid number,dogName varchar2(20) constraint Un_dogName Unique);
方法二:Alter table 表名 add constraint 约束名 Unique(被约束字段);
Create table dog(dogid number,dogName varchar2(20));
Alter table dog add constraid Un_dogName Unique(dogName);
检查约束的添加检查约束的添加检查约束的添加检查约束的添加-------->>>>


方法一:Create table 表名(列名1 列名1类型 constraint 约束名 Check(表达式),列名2 列名2类型,列名N 列名N类型);
Create table pig(pigID number constraint CK_pigID Check(PigID >=0),pigName varchar2(20));
方法二:Alter table 表名 add co

nstraint 约束名 Check(表达式);
Create table pig(pigId number,pigName varchar2(20));
Alter table pig add constraint CK_pigID Check(pigID >= 0);
<约束删除语句:Alter table 表名 drop constraint 约束名>
Alter table pig drop constraint CK_pigID;
-----------------------------------------------------------------------------------------------------------------
约束的追加:
以下几种约束 、并 一一列举:

1.主键约束:
要对一个列加主键约束的话,这列就必须要满足的条件就是分空
因为主键约束:就是对一个列进行了约束,约束为(非空、不重复)
以下是代码 要对一个列加主键,列名为id,表名为emp

格式为:
alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)

例子:
alter table emp add constraint ppp primary key (id)

————————————————————————————————

2.check约束:
就是给一列的数据进行了限制
比方说,年龄列的数据都要大于20的
表名(emp) 列名(age)

格式:
alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)

例子:
alter table emp add constraint xxx check(age>20)

______________________________________________________________________

3.unique约束:
这样的约束就是给列的数据追加的不重复的约束类型

格式:
alter table 表名 add constraint 约束名称 约束类型(列名)
比方说可以给ename列加个unique,让ename列的数据不重复
例子:
alter table emp add constraint qwe unique(ename)

————————————————————————————————

4.默认约束:
意思很简单就是让此列的数据默认为一定的数据

格式:
alter table 表名称 add constraint 约束名称 约束类型 默认值) for 列名

比方说:emp表中的gongzi列默认为10000

alter table emp add constraint jfsd default 10000 for gongzi


————————————————————————————————

5.外键约束:
这个有点难理解了,外键其实就是引用
因为主键实现了实体的完整性,
外键实现了引用的完整性,
应用完整性规定,所引用的数据必须存在!

其实就是个引用,
比方说一个表名称叫dept 里面有2列数据 一列是ID一列是ENAME
id:表示产品的编号
ename:表示产品的名称

另外一个表格名称是emp 里面有2列数据,一列是ID 一列是DID
id:表示用户号
did:表示购买的产品号

要让emp表中的did列去引用dept表中的id

可以用下面的方法

格式:
alter table 表名 add constraint 约束名称 约束类型 (列名) references 被引用的表名称 (列名)

例子:
alter table emp add constraint jfkdsj foreign key (did) references de

pt (id)
----------------------------------------------------------------------------------------------------------


执行以下sql生成的语句即可

1

删除所有外键约束

select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints where constraint_type='R'

2

禁用所有外键约束

select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R'

3

启用所有外键约束

select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R'
表的建立

Oracle中包括五种约束,包括主键约束(primary key,该属性的值不能为空,不可重复,默认该列自动建立索引),外键约束(foreign key() references rname,参照完整性约束,该属性的值必须在所对应的关系中存在),非空约束(not null),唯一约束(unique,不可重复,但可以为空,因为在数据库中,该表达式 null=null 的返回结果为unknown),check约束(check(a in(a1,a2,a3))),如下例

create table r1
( id numeric(15) primary key, //主键约束
name varchar2(15) not null, //非空约束
gender varchar2(2) check(gender in ('M','F','O')), //模拟枚举约束,Oracle中不支持枚举类型
stu_number unique, //禁止重复,但可以为空
foreign key(stu_number) references r0); //外键约束

表的修改

1.增加一个新的属性

alter table r add id varchar2(10);

2.减少一个已经存在的属性

alter table r drop column name; (不行的话,就在 drop 关键字的后面添加上一个column 的关键字)

3.修改一个已经存在的属性的限制

alter table test1 modify grade number(5,2) not null;

4.修改一个已经存在的属性的属性名称

alter table test1 rename column id to stu_number; -- 要注意的是你不要使用 oracle 的 关键字就可以了。否则或包标示符无效。

完整性约束

完整性约束用于增强数据的完整性,Oracle提供了5种完整性约束:

Check

NOT NULL

Unique

Primary

Foreign key

完整性约束是一种规则,不占用任何数据库空间。完整性约束存在数据字典中,在执行SQL或PL/SQL期间使用。用户可以指明约束是启用的还是禁用的,
吧 当约束启用时,他增强了数据的完整性,否则,则反之,但约束始终存在于数据字典中。

禁用约束,使用ALTER语句

ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;



ALTER TABLE policies DISABLE CONSTRAINT chk_gender

如果要重新启用约束:

ALTER TABLE policies ENABLE CONSTRAINT chk_gender

删除约束

ALTER TABLE table_name DROP CONSTRAINT constraint_name



ALTER TABLE policies DROP CONSTRAINT chk_gender;


Check 约束

在数据列上Check 约束需要 一个特殊的布尔条件或者将数据列设置成TRUE,至少一个数据列的值是NULL,Check约束用于增强表中数据内容的简单的商业规则。
用户使用Check约束保证数据规则的一致性。Check约束可以涉及该行同属Check约束的其他数据列但不能涉及其他行或其他表,或调用函数SYSDATE,UID,USER,USERENV。
如果用户的商业规则需要这类的数据检查,那么可以使用触发器。Check约束不保护LOB数据类型的数据列和对象、嵌套表、VARRY、ref等。
单一数据列可以有多个Check约束保护,一个Check约束可以保护多个数据列。

创建表的Check约束使用CREATE TABLE语句,更改表的约束使用ALTER TABLE语句。

语法:

CONSTRAINT [constraint_name] CHECK (condition);

Check约束可以被创建或增加为一个表约束,当Check约束保护多个数据列时,必须使用表约束语法。约束名是可选的并且如果这个名字不存在,
那么oracle将产生一个以SYS_开始的唯一的名字。

例:

CREATE TABLE policies
(policy_id NUMBER,
holder_name VARCHAR2(40),
gender VARCHAR2(1) constraint chk_gender CHECK (gender in ('M','F'),
marital_status VARCHAR2(1),
date_of_birth DATE,
constraint chk_marital CHECK (marital_status in('S','M','D','W'))
);

NOT NULL约束

NOT NULL约束应用在单一的数据列上,并且他保护的数据列必须要有数据值。缺省状况下,ORACLE允许任何列都可以有NULL值。某些商业规则要求某数据列必须要有值,
NOT NULL约束将确保该列的所有数据行都有值。

例:



CREATE TABLE policies
(policy_id NUMBER,
holder_name VARCHAR2(40) NOT NULL,
gender VARCHAR2(1),
marital_status VARCHAR2(1),
date_of_birth DATE NOT NULL
);

对于NOT NULL的ALTER TABLE语句与其他约束稍微有点不同。

ALTER TABLE policies MODIFY holder_name NOT NULL

唯一性约束(Unique constraint)

唯一性约束可以保护表中多个数据列,保证在保护的数据列中任何两行的数据都不相同。唯一性约束与表一起创建,在唯一性约束创建后,
可以使用ALTER TABLE语句修改。

语法:
column_name data_type CONSTRAINT constraint_name UNIQUE



如果唯一性约束保护多个数据列,那么唯一性约束要作为表约束增加。语法如下:
(就是说如果一个约束约束的是两个列或者是两个以上的话,就要将该约束创建为表级别的约束)





CONSTRAINT constraint_name (column) UNIQUE USING INDEX TABLESPACE (tablespace_name) STORAGE (stored clause)

唯一性约束由一个B-tree索引增强,所以可以在USING子串中为索引使用特殊特征,比如表空间或存储参数。
CREATE TABLE语句在创建唯一性约束的同时也给

目标数据列建立了一个唯一的索引。

CREATE TABLE insured_autos
(policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
vin VARCHAR2(10),
coverage_begin DATE,
coverage_term NUMBER,
CONSTRAIN unique_auto UNIQUE (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
);


用户可以禁用未以性约束,但他仍然存在,禁用唯一性约束使用ALTER TABLE 语句

ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name;


删除唯一性约束,使用ALTER TABLE....DROP CONSTRAIN语句

ALTER TABLE insured_autos DROP CONSTRAIN unique_name;


注意用户不能删除在有外部键指向的表的唯一性约束。这种情况下用户必须首先禁用或删除外部键(foreign key)。

删除或禁用唯一性约束通常同时删除相关联的唯一索引,因而降低了数据库性能。经常删除或禁用唯一性约束有可能导致丢失索引带来的性能错误。
要避免这样错误,可以采取下面的步骤:

1、在唯一性约束保护的数据列上创建非唯一性索引。

2、添加唯一性约束

主键(Primary Key)约束

表有唯一的主键约束。表的主键可以保护一个或多个列,主键约束可与NOT NULL约束共同作用于每一数据列。
NOT NULL约束和唯一性约束的组合将保证主键唯一地标识每一行。像唯一性约束一样,主键由B-tree索引增强。

创建主键约束使用CREATE TABLE语句与表一起创建,如果表已经创建了,可以使用ALTER TABLE语句。



CREATE TABLE policies
(policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
holder_name VARCHAR2(40),
gender VARCHAR2(1),
marital_status VARCHAR2(1),
date_of_birth DATE
);


与唯一性约束一样,如果主键约束保护多个数据列,那么必须作为一个表约束创建。

CREATE TABLE insured_autos
(policy_id NUMBER,
vin VARCHAR2(40),
coverage_begin DATE,
coverage_term NUMBER,
CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin)
USING INDEX TABLESPACE index
STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
);


禁用或删除主键必须与ALTER TABLE 语句一起使用 (一般来说一张表中只有一个主键(但是可能有多列组成))


ALTER TABLE policies DROP PRIMARY KEY;



ALTER TABLE policies DISABLE PRIMARY KEY;
 在此,我将Oracle中的约束总结为6种,即:

lNOT NULL约束

DEFAULT约束 (DEFAULT在Oracle中好象没有被作为约束处理,因为创建后从USER_CONSTRAINTS中查不到,有谁知道怎么查,还望不吝赐教)

lPRIMARY KEY约束

llCHECK约束

lUNIQUE约束

lFOREIGN KEY约束

l1: NOT NULL约束和DEFAULT约束只能被创建为列级约束

l2: 其他4种则既可以被创建为列级约束,也可以被创建为表级约束

l3:

当一个约束涉及到多列时,只能被创建成表级约束

l4: 可以为其他4种约束起名,而不能给NOT NULL和DEFAULT约束起名

列级约束的添加方式:

创建表时在列后面直接定义;(1)

修改表时以修改列的方式实现;(2)

可以作为表级约束的4种约束,作为列级约束时有两种添加方式,与上面相同,区别是可以起名;

作为表级约束时有两种添加方式:

创建表时添加表级约束;(3)

修改表时添加表级约束;(4)

下面以主键为例具体说明:

Create table t1(tid number primary key); (1)

或者加约束名字: create table t1(tid number constraint pk_tid primary key);

Create table t2(tid number);

alter table t2 modify tid primary key; (2)

或者:alter table t2 modify tid number primary key;

create table t3(tid number,primary key(tid)); (3)

或者加约束名字: create table t3(tid number,constraint pk_t3id primary key(tid));

create table t4(tid number);

alter table t4 add primary key(tid); (4)

或者加约束名字: alter table t4 add constraint pk_t4id primary key(tid);

相关主题