约束定义:
约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。定义约束时没有给出约束的名字,ORACE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称。).
约束功能:
实现一些业务规则,防止无效的垃圾数据进入数据库,维护数据库的完整性(完整性指正确性与一致性)。从而使数据库的开发和维护都更加容易。
约束分类:
非空(NOT NULL)约束 : 所约束的列不能为NULL值。否则就会报错。
语法格式:CONSTRAINT constraint_name NOT NULL
实例1:在创建BOOKINFO表时,给图书名称加上一个非空约束(book_name_nn)
CREATE TABLE BOOKINFO
(
BOOKID NUMBER,
BOOKNAME varchar2(50) constraint book_name_nn NOT NULL,
PRICE DECIMAL,
AUTHOR CHAR
);
实例2:为已存在的表BOOKINFO中的图书名称列加上一个非空约束(book_name_nn)
alter table BOOKINFO
modify (BOOKNAME varchar2(50) constraint book_name_nn not null);
唯一(UNIQUE)约束 : 在表中每一行中所定义的这列或这些列的值都不能相同。必须保证唯一性。否则就会违法约束条件。
语法格式:CONSTRAINT constraint_name UNIQUE(column_name)
实例3:创建BOOKINFO表时,为图书名称(BOOKNAME)列添加唯一约束(book_name_uq)
CREATE TABLE BOOKINFO
(
BOOKID NUMBER,
BOOKNAME varchar2(50),
PRICE DECIMAL,
AUTHOR CHAR,
CONSTRAINT book_name_uq UNIQUE (BOOKNAME)
);
实例4:为已存在的表BOOKINFO中的图书名称列加上一个唯一约束(book_name_uq)
alter table BOOKINFO
add constraint book_name_uq UNIQUE(BOOKNAME);
主键(PRIMARY KEY)约束 : 唯一的标识表中的每一行,不能重复,不能为空。
语法格式:CONSTRAINT constraint_name primary key (column_name)
实例5:创建BOOKINFO表时,为图书ID(BOOKID)列添加主键约束(book_id_pk)
CREATE TABLE BOOKINFO
(
BOOKID NUMBER,
BOOKNAME varchar2(50),
PRICE DECIMAL,
AUTHOR CHAR,
CONSTRAINT book_id_pk primary key (BOOKID)
);
实例6:为已存在的表BOOKINFO中的图书ID列加上一个主键约束(book_id_pk)
alter table BOOKINFO
add constraint book_id_pk primary key(BOOKID);
外键(FOREIGN KEY)约束 : 用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性. 外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销。
语法格式 : CONSTRAINT constraint_name foreign key(column_name) references 主表表名(主键列)
实例7:创建BOOKINFO表时,为图书类型(TYPEID)列添加外键约束(book_type_fk)
CREATE TABLE BOOKINFO
(
BOOKID NUMBER,
BOOKNAME varchar2(50),
PRICE DECIMAL,
AUTHOR CHAR,
TYPEID NUMBER,
CONSTRAINT book_type_fk foreign key (BOOKID) references BOOKTYPE (TYPEID)
);
这里要注意,在创建外键约束前一定要先创建BOOKTYPE表,并为TYPEID列添加主键约束.
CREATE TABLE BOOKTYPE
(
TYPEID NUMBER,
TYPENAME varchar2(50),
CONSTRAINT book_type_pk primary key (TYPEID)
);
实例8:为已存在的表BOOKINFO中的图书类型列(TYPEID)加上一个外键约束(book_type_fk)
alter table BOOKINFO
add constraint book_type_fk foreign key(BOOKID) references BOOKTYPE (TYPEID);
这里也要注意,在添加外键约束前必须先创建BOOKTYPE表,并为TYPEID列添加主键约束.
条件(CHECK)约束 : 表中每行都要满足该约束条件。条件约束既可以在表一级定义也可以在列一级定义。在一列上可以定义任意多个条件约束。
语法格式:CONSTRAINT constraint_name check (约束条件)
实例9:创建BOOKINFO表时,为图书价格(PRICE)列添加检查约束(book_price_ck),约束条件为:价格>0
CREATE TABLE BOOKINFO
(
BOOKID NUMBER,
BOOKNAME varchar2(50),
PRICE DECIMAL,
AUTHOR CHAR,
CONSTRAINT book_price_ck check (PRICE>0)
);
实例10:为已存在的表BOOKINFO中的图书价格(PRICE)加上一个检查约束(book_price_ck),约束条件为:价格>0
alter table BOOKINFO
add constraint book_price_ck check (PRICE>0);
约束管理:
1.删除约束
ALTER TABLE BOOKINFO DROP CONSTRAINT 约束名;
2.有效化和无效化约束
使约束失效:
ALTER TABLE 表名 DISABLE CONSTRANT 约束名;
使约束条件生效:
ALTER TABLE 表名 ENABLE CONSTRANT 约束名;