ORACLE表的约束 SQL

表的约束

    表的约束是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;

注意

  1. 一张表只有一个主键,主键非空且唯一
  2. 外键只能依赖于另一张表的主键(例如EMP表中的DEPTNO依赖于DEPT表中的DEPTNO)
  3. 约束不能修改,只能删除重建

约束也可以在创建表的时候添加

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分享的表约束内容,比心 笔芯~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值