0
点赞
收藏
分享

微信扫一扫

MySQL基础学习(十一)——约束

陆佃 2022-05-06 阅读 107

目录

一、约束

1、为什么需要约束

2、什么是约束

3、约束的分类

 二、非空约束(NOT NULL)

1、特点

2、添加非空约束

(1)在CREATE TABLE时添加约束

(2)在ALTER TABLE时添加约束

 3、删除非空约束

三、唯一性约束(UNIQUE)

1、特点

2、添加唯一约束

(1)在CREATE TABLE时添加约束

(2)在ALTER TABLE时添加约束

3、复合唯一约束

4、删除唯一约束

四、PRIMARY KEY 约束

1、特点

2、添加唯一主键约束

(1)在CREATE TABLE时添加约束

(2)在ALTER TABLE时添加约束

3、复合主键约束

4、删除唯一主键约束

五、自增列(AUTO_INCREMENT)

1、特点

2、添加自增列

(1)在CREATE TABLE 时添加

(2)在ALTER TABLE 时添加

3、删除自增列

 ​

六、FOREIGN KEY 约束

1、特点

2、添加外键约束

(1)在CREATE TABLE 时添加

(2)在ALTER TABLE 时添加

 3、约束等级

4、删除外键约束

七、DEFAULT约束

1、添加约束

(1)在CREATE TABLE 时添加

(2)在ALTER TABLE 时添加

2、删除约束


一、约束

1、为什么需要约束

为了保证数据的完整性, SQL 规范以约束的方式对 表数据进行额外的条件限制 。从以下四个方面考虑:

  • 实体完整性(Entity Integrity:例如,同一个表中,不能存在两条完全相同无法区分的记录
  • 域完整性(Domain Integrity:例如:年龄范围0-120,性别范围/
  • 引用完整性(Referential Integrity:例如:员工所在部门,在部门表中要能找到这个部门
  • 用户自定义完整性(User-defined Integrity:例如:用户名唯一、密码不能为空等,本部门 经理的工资不得高于本部门职工的平均工资的5倍。

2、什么是约束

约束是表级的强制规定。

可以在 创建表时规定约束(通过 CREATE TABLE 语句) ,或者在 表创建之后通过 ALTER TABLE 语句规定 约束

3、约束的分类

根据约束数据列的限制, 约束可分为:

  • 单列约束:每个约束只约束一列
  • 多列约束:每个约束可约束多列数据

根据约束的作用范围 ,约束可分为:

  • 列级约束:只能作用在一个列上,跟在列的定义后面
  • 表级约束:可以作用在多个列上,不与列一起,而是单独定义

根据约束起的作用 ,约束可分为:

  • NOT NULL 非空约束,规定某个字段不能为空
  • UNIQUE 唯一约束规定某个字段在整个表中是唯一的
  • PRIMARY KEY 主键(非空且唯一)约束
  • FOREIGN KEY 外键约束
  • CHECK 检查约束
  • DEFAULT 默认值约束

 二、非空约束(NOT NULL)

1、特点

  • 默认,所有的类型的值都可以是NULL,包括INTFLOAT等数据类型
  • 非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空
  • 一个表可以有很多列都分别限定了非空
  • 空字符串''不等于NULL0也不等于NULL

2、添加非空约束

(1)在CREATE TABLE时添加约束

CREATE TABLE TEST1(
	ID INT NOT NULL,
	LAST_NAME VARCHAR(15) NOT NULL,
	EMAIL VARCHAR(25),
	SALARY DECIMAL(10,2)
)

 

INSERT INTO TEST1(ID,LAST_NAME,EMAIL,SALARY)
VALUES(1,NULL,'123@QQ.COM',3400)

 

INSERT INTO TEST1(ID,EMAIL)
VALUES(2,'222@QQ.COM')

(2)在ALTER TABLE时添加约束

ALTER TABLE TEST1
MODIFY EMAIL VARCHAR(25) NOT NULL

 

 3、删除非空约束

ALTER TABLE TEST1
MODIFY EMAIL VARCHAR(25) NULL

三、唯一性约束(UNIQUE)

1、特点

  • 同一个表可以有多个唯一约束。
  • 唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
  • 唯一性约束允许列值为空。
  • 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
  • MySQL会给唯一约束的列上默认创建一个唯一索引。

2、添加唯一约束

(1)在CREATE TABLE时添加约束

CREATE TABLE TEST2(
	ID INT UNIQUE, #列级约束
	LAST_NAME VARCHAR(15),
	EMAIL VARCHAR(25),
	SALARY DECIMAL(10,2)

    #表级约束
    CONSTRAINT UK_TEST2_EMAIL UNIQUE(EMAIL)
)

INSERT INTO TEST2(ID,LAST_NAME,EMAIL,SALARY)
VALUES(1,'TOM','123@QQ.COM',4500)

当插入的数据ID没有改变时就会报错

INSERT INTO TEST2(ID,LAST_NAME,EMAIL,SALARY)
VALUES(1,'TOM1','1231@QQ.COM',4600)

 可以向声明为unique的字段上添加null值,可以多次添加null值

INSERT INTO TEST2(ID,LAST_NAME,EMAIL,SALARY)
VALUES(2,'TOM1',NULL,4600)

(2)在ALTER TABLE时添加约束

ALTER TABLE TEST2
ADD CONSTRAINT UK_TEST2_SALARY UNIQUE(SALARY)

 

3、复合唯一约束

CREATE TABLE USER(
	ID INT,
	NAME VARCHAR(15),
	PASSWORD VARCHAR(25),
	
	#表级约束
	CONSTRAINT UK_USER_NAME_PWD UNIQUE(NAME,PASSWORD)
)

 当Key是MUL时,那么该列的值可以重复,并且该列是一个非唯一索引的前导列。

 

INSERT INTO USER
VALUES(1,'TOM','ABC'),(1,'TOM1','ABC')

4、删除唯一约束

  • 添加唯一性约束的列上也会自动创建唯一索引。
  • 删除唯一约束只能通过删除唯一索引的方式删除。
  • 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
  • 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。
ALTER TABLE TEST2
DROP INDEX UK_TEST2_SALARY

 

四、PRIMARY KEY 约束

1、特点

  • 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
  • 主键约束对应着表中的一列或者多列(复合主键)
  • 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
  • MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
  • 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
  • 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性

2、添加唯一主键约束

(1)在CREATE TABLE时添加约束

CREATE TABLE TEST3(
	ID INT PRIMARY KEY, #列级约束
	LAST_NAME VARCHAR(15),
	SALARY DECIMAL(10,2),
	EMAIL VARCHAR(25)

	#表级约束
-- 	CONSTRAINT PK_TEST4_ID PRIMARY KEY(ID)
)

INSERT INTO TEST3(ID,LAST_NAME,SALARY,EMAIL)
VALUES(1,'TOM',4500,'123@QQ.COM')

(2)在ALTER TABLE时添加约束

CREATE TABLE TEST5(
	ID INT,
	LAST_NAME VARCHAR(15),
	SALARY DECIMAL(10,2),
	EMAIL VARCHAR(25),
)

ALTER TABLE TEST5
ADD PRIMARY KEY(ID)

 

3、复合主键约束

CREATE TABLE USER1(
	ID INT,
	NAME VARCHAR(15),
	PASSWORD VARCHAR(25),
	
	PRIMARY KEY(NAME,PASSWORD)
)

 

INSERT INTO USER1
VALUES(1,'TOM','ABC'),(2,'TOM1','ABC')

 

4、删除唯一主键约束

ALTER TABLE TEST5
DROP PRIMARY KEY 

五、自增列(AUTO_INCREMENT)

1、特点

  • 一个表最多只能有一个自增长列
  • 当需要产生唯一标识符或顺序值时,可设置自增长
  • 自增长列约束的列必须是键列(主键列,唯一键列)
  • 自增约束的列的数据类型必须是整数类型
  • 如果自增列指定了 0 null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接赋值为具体值。

2、添加自增列

(1)在CREATE TABLE 时添加

CREATE TABLE TEST7(
	ID INT PRIMARY KEY AUTO_INCREMENT,
	LAST_NAME VARCHAR(15)
)

 

INSERT INTO TEST7(LAST_NAME)
VALUES('TOM'),('TOM')

 

(2)在ALTER TABLE 时添加

CREATE TABLE TEST8(
	ID INT PRIMARY KEY,
	LAST_NAME VARCHAR(15)
)

ALTER TABLE TEST8
MODIFY ID INT AUTO_INCREMENT

3、删除自增列

ALTER TABLE TEST8
MODIFY ID INT

 

六、FOREIGN KEY 约束

1、特点

  • 从表的外键列,必须引用/参考主表的主键或唯一约束的列
  • 在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名
  • 创建(CREATE)表时就指定外键约束的话,先创建主表,再创建从表
  • 删表时,先删从表(或先删除外键约束),再删除主表
  • 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据
  • 从表中指定外键约束,并且一个表可以建立多个外键约束
  • 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致
  • 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束名。(根据外键查询效率很高)
  • 删除外键约束后,必须 手动 删除对应的索引

2、添加外键约束

(1)在CREATE TABLE 时添加

-- 创建主表
CREATE TABLE DEPT1(
	DEPT_ID INT PRIMARY KEY,
	DEPT_NAME VARCHAR(15)
)
-- 创建从表
CREATE TABLE EMP1(
	EMP_ID INT PRIMARY KEY AUTO_INCREMENT,
	EMP_NAME VARCHAR(15),
	DEPARTMENT_ID INT,
	
	#表级约束
	CONSTRAINT FK_EMP1_DEPT_ID FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPT1(DEPT_ID)
)

 

 

INSERT INTO DEPT1
VALUES(10,'IT')

INSERT INTO EMP1
VALUES(1001,'TOM',10)

 

 

(2)在ALTER TABLE 时添加

create table dept( 
    did int primary key, #部门编号 
    dname varchar(50) #部门名称 
);

create table emp( 
    eid int primary key, #员工编号 
    ename varchar(5), #员工姓名 
    did int, #员工所在的部门
    foreign key (did) references dept(did) 
    #emp表的deptid和和dept表的did的数据类型一致,意义都是表示部门的编号 
    #是否重名没问题,因为两个did在不同的表中 
);

 3、约束等级

  • Cascade方式 :在父表上update/delete记录时,同步update/delete掉子表的匹配记录
  • Set null方式 :在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子
  • 表的外键列不能为not null
  • No action方式 :如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
  • Restrict方式 :同no action, 都是立即检查外键约束
  • Set default方式 (在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别

如果没有指定等级,就相当于Restrict方式。

对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。

4、删除外键约束

ALTER TABLE EMP1
DROP FOREIGN KEY FK_EMP1_DEPT_ID

ALTER TABLE EMP1
DROP INDEX FK_EMP1_DEPT_ID

七、DEFAULT约束

1、添加约束

(1)在CREATE TABLE 时添加

create table test9( 
	eid int primary key, 
	ename varchar(20) not null, 
	gender char default '男', 
	tel char(11) not null default '' #默认是空字符串 
);

 

insert into test9 
values(1,'汪飞','女','13700102535');

insert into test9(eid,ename) 
values(2,'天琪');

(2)在ALTER TABLE 时添加

create table test10( 
    eid int primary key, 
    ename varchar(20), 
    gender char, 
    tel char(11) not null 
);
alter table employee modify gender char default '男'; #给gender字段增加默认值约束 
alter table employee modify tel char(11) default ''; #给tel字段增加默认值约束

结果和上面的效果一样

2、删除约束

alter table test9
modify gender char

 

 

举报

相关推荐

0 条评论