表的约束
表的约束是Oracle数据库中应用在表数据上的一系列强制性规则。当向已创建的表中插入数据或修改表中的数据时,必须满足表的完整性约束所规定的条件。
例如,学生的性别必须是“男”或“女”,各个学生的学号不得相同等。
在设计表的结构是,应该充分考虑在表上需要施加的完整性约束。表的完整性约束既可以在创建表时制定,也可以在表创建之后再指定。
可以对一个或多个字段进行约束。
按照约束用途分类:
1.PRIMARY KEY:主键约束
2.FOREIGN KEY:外键约束
3.CHECK:检查约束
4.UNIQUE:唯一约束
5.NOT NULL:非空约束
创建约束则使用如下命令:
语法格式:ALTER TABLE命令
ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束内容
语法格式:添加主键约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY(列名1[,列名2...])
语法格式:添加外键约束
ALTER TABLE 主表名 ADD CONSTRAINT 约束名 FOREIGN KEY(列名1[,列名2...]) REFERENCES 从表名(列名1[,列名2...])
语法格式:添加CHECK约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK(条件)
语法格式:添加唯一约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名)
语法格式:添加非空约束
ALTER TABLE 表名 MODIFY 列名 NOT NULL
语法格式:删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名
【例1】为学生表(student_1)学号添加主键约束,姓名添加非空约束,性别添加检查约束
ALTER TABLE student_1 ADD CONSTRAINT PK_SNO PRIMARY KEY(sno);
ALTER TABLE student_1 MODIFY sname NOT NULL;
ALTER TABLE student_1 ADD CONSTRAINT CK_SNO CHECK(ssex='男' OR ssex='女');
--删除整个表
DROP TABLE STU1;
--建表,但没有写任何约束
CREATE TABLE STU1(
SNO VARCHAR2(10),
SNAME VARCHAR2(30),
SSEX VARCHAR2(2),
SAGE NUMBER(3),
SBIRTHDAY DATE
)
--年龄填写1000超出建表时的长度,直接不给你插入数据!
--INSERT INTO STU1 VALUES('', 'A1', 'MA', 1000, TO_DATE(19930114, 'YYYY/MM/DD'));
--插入一条正常的数据
INSERT INTO STU1 VALUES('001', 'A1', 'MA', 100, TO_DATE(19930114, 'YYYY/MM/DD'));
SELECT *
FROM STU1;
--创建了主键约束后,主键默认不能为空,而且是唯一的
ALTER TABLE STU1 ADD CONSTRAINT AA PRIMARY KEY(SNO);
--SNO为空,明显提示无法插入该行数据
--INSERT INTO STU1 VALUES('', 'A1', 'MA', 100, TO_DATE(19930114, 'YYYY/MM/DD'));
--目前可以添加一行“没名字”的记录
--INSERT INTO STU1 VALUES('002', '', 'MA', 100, TO_DATE(19930114, 'YYYY/MM/DD'));
--此时无法添加该约束,因为表中SNAME列有一行是空的
--ALTER TABLE STU1 MODIFY SNAME NOT NULL;
--我们来删除掉那一行有空值的SNAME
DELETE STU1
WHERE SNAME IS NULL;
--再尝试添加约束,呀!成功了!
ALTER TABLE STU1 MODIFY SNAME NOT NULL;
--有提示告诉你不可以这么淘气,连名字都不写就交卷!
--INSERT INTO STU1 VALUES('002', '', 'MA', 100, TO_DATE(19930114, 'YYYY/MM/DD'));
--下面我们来添加一个CHECK约束, 约束不可以跟前面的约束同名
--ALTER TABLE STU1 ADD CONSTRAINT AA CHECK (SSEX='男'OR SSEX='女');
--提示违反约束条件
ALTER TABLE STU1 ADD CONSTRAINT GENDER CHECK (SSEX='男'OR SSEX='女');
SELECT *
FROM STU1 S
WHERE S.SSEX NOT IN ('男', '女');
DELETE STU1 S
WHERE S.SSEX NOT IN ('男', '女');
ALTER TABLE STU1 ADD CONSTRAINT GENDER CHECK (SSEX='男'OR SSEX='女');
--目前如果再插入非 男 或 女,就会有错误提示出现
INSERT INTO STU1 VALUES('001', 'A1', 'MA', 100, TO_DATE(19930114, 'YYYY/MM/DD'));
--插入一条符合规定的数据
INSERT INTO STU1 VALUES('001', 'A1', '男', 100, TO_DATE(19930114, 'YYYY/MM/DD'));
INSERT INTO STU1 VALUES('002', 'A1', '女', 90, TO_DATE(19930114, 'YYYY/MM/DD'));
INSERT INTO STU1 VALUES('003', 'A1', '男', 80, TO_DATE(19930114, 'YYYY/MM/DD'));
INSERT INTO STU1 VALUES('004', 'A1', '女', 70, TO_DATE(19930114, 'YYYY/MM/DD'));
SELECT *
FROM STU1;
注意:
- 一张表只有一个主键,主键非空且唯一
- 外键只能依赖于另一张表的主键(例如EMP表中的DEPTNO依赖于DEPT表中的DEPTNO)
- 约束不能修改,只能删除重建
约束也可以在创建表的时候添加
CREATE TABLE student_1(
sno VARCHAR2(10) PRIMARY KEY,
sname VARCHAR2(30) NOT NULL,
ssex VARCHAR2(2) CHECK(ssex='男' OR ssex='女'),
sage NUMBER(3),
sbirthday DATE
)
以上,就是王HTML分享的表约束内容,比心 笔芯~