关于李兴华老师数据库建表的约束总结
约束简介:(重点)
数据表本身只支持数据的存储操作,但是在数据库上为了保证数据的完整性,
特别增加了约束,即需要满足若干条件才可以进行操作,本质上数据库的约束
一共有六种:
----------
数据类型
非空约束(重点)
唯一约束
主键约束(重点)
检查约束(了解)
外键约束(重点)
约束的确保证了数据在合法后才进行保存,但是一个数据库中设置了过多的约束,那么更新的速度慢,所以在开发中,某一些验证操作还是交给程序完成。
- 数据类型
常用的数据类型
VARCHAR2 字符串(200个文字以内使用 )
NUMBER 数字
DATE 日期(oracle包含日期时间)
CLOB 大文本数据(可保存4G文字信息)
2、 非空约束 NOT NULL
当表中某一个字段不允许为空,如果要使用非空约束,只需要使用非空约束
"NOT NULL"声明即可。
CREATE TABLE not_null_demo(
name1 VARCHAR2(20) NOT NULL,
sex VARCHAR2(6),
sal NUMBER(8,2)
);
INSERT INTO not_null_demo (name1,sex,sal) VALUES ('张三','boy',10000.00);
//当插入下列数据时,会报错
INSERT INTO not_null_demo (name1,sex,sal) VALUES (null,'boy',10000.00);
3、唯一约束 (UNIQUE、UK)
特点:在某一列上的内容不允许出现重复。
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(20) NOT NULL,
email VARCHAR(20) UNIQUE
)
INSERT INTO member (mid,name,email) VALUES(1,'xiaomage','123@qq.com');
报错:INSERT INTO member (mid,name,email)
VALUES(2,'ma ge','123@qq.com');
发现唯一约束并不会向非空约束那样,明确告知错误信息,为了解决此类问题
可以采用 “约束类型简写_[表名]_列名” 如:
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(20) NOT NULL,
email VARCHAR(20),
CONSTRAINT uk_member_email UNIQUE (email)
)
INSERT INTO member (mid,name,email) VALUES(1,'xiaomage','123@qq.com');
错误:INSERT INTO member (mid,name,email)
VALUES(2,'ma ge','123@qq.com');
错误信息为:在行: 113 上开始执行命令时出错 -
INSERT INTO member (mid,name,email) VALUES(2,'ma ge','123@qq.com')
错误报告 -
ORA-00001: 违反唯一约束条件 (SCOTT.UK_MEMBER_EMAIL)
注意:只要进行数据表的创建时,约束一定要设置名字,且约束名不能重复。
4、主键约束(PRIMARY KEY 、PK)
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(20) NOT NULL,
email VARCHAR(20),
CONSTRAINT pk_member_mid PRIMARY KEY (mid)
)
INSERT INTO member (mid,name,email) VALUES(1,'xiaomage','123@qq.com');
错误: INSERT INTO member (mid,name,email) VALUES(1,'mage','12712@qq.com');
错误提示:在行: 113 上开始执行命令时出错 -
INSERT INTO member (mid,name,email) VALUES(1,'mage','12712@qq.com')
错误报告 -
ORA-00001: 违反唯一约束条件 (SCOTT.PK_MEMBER_MID)
主键约束 = 非空约束 + 唯一约束;
也就是说,设置为主键的列不能为空,也不能重复。
5、检查约束 (CHECK、CK)
指在数据列上设置一些过滤条件,当过滤条件满足的时候,才可以进行保存,否则报错。
列如:设置年龄信息在 0 ~ 300之间,性别
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(20) NOT NULL,
age NUMBER,
email VARCHAR(20),
CONSTRAINT pk_member_mid PRIMARY KEY (mid),
CONSTRAINT ck_member_age CHECK (age BETWEEN 0 AND 300)
)
INSERT INTO member (mid,name,age,email) VALUES(1,'xiaomage',60,'123@qq.com');
错误: INSERT INTO member (mid,name,age,email) VALUES(1,'mage',400,'12712@qq.com');
错误提示:在行: 116 上开始执行命令时出错 -
INSERT INTO member (mid,name,age,email) VALUES(1,'mage',400,'12712@qq.com')
错误报告 -
ORA-02290: 违反检查约束条件 (SCOTT.CK_MEMBER_AGE)
从实际开发讲,检查约束尽量不要用(损耗性能),检查通过程序完成。
外键约束
定义:在父子表中体现的一种约束模式,列如父表person,子表books,关联字段mid。 在设置外键约束的时候必须设置指定的外键列(MID)列,与哪张表的哪个列有关联。
CREATE TABLE PERSON(
MID NUMBER,
NAME VARCHAR2(20),
CONSTRAINT PK_PERSON_MID PRIMARY KEY (MID)
);
外键约束: (FOREIGN KEY 、FK)
CREATE TABLE BOOKS(
MID NUMBER,
BOOKNAME VARCHAR2(25),
bookNumber NUMBER,
CONSTRAINT fk_PERSON_MID FOREIGN
KEY(MID)REFERENCES PERSON (MID)
);
对于外键的使用的限制:
所谓的外键就是相当于子表的某一个字段的内容由父表来决定的其具体的使用数据范围。对外键来说,最麻烦的就是一些限制。
限制一:在删除父表之前,需要先删除其所有的子表才可以删除,
如遇到奇葩设计者,A是B的父表,B又是A的父表,这是可以使用强制删除操作,
删除后不关心子表,DROP TABLE person CASCADE CONSTRAINT;
限制二:如果要作为子表外键的父表列,那么这个列必须设置唯一约束或主键约束
限制三:如果现在主表中的某一行数据有对应的子表数据,那么必须先删除子表的全部数据,再删除父表。如果不想受到子记录的影响,可以使用级联的操作关系,级联关系有两种:级联删除,级联更新。
级联删除:指在父表数据已经被删除的情况下,自动删除其对应子表的数据,
再定义外键的时候后面加上 ON DELETE CASCAED即可。
此时删除父表的数据时,子表的数据会同时删除掉。
级联更新:在删除父表数据的时候,那么对应的子表的数据的外键设置为null,
加上ON DELETE SETNULL。
总结:综合来讲,不要去修改表结构,约束条件应该和表一起创建。
重要的约束 PRIMARY KEY,FROEIGN KEY,NOT NULL