常见的约束
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。
常见约束分类:六大分类 重点
not null:非空,用于保证该字段的值不能为空,比如姓名,学号等。
default:默认,用于保证该字段有默认值。比如性别
primary key:主键,用于保证该字段的值具有唯一性,并且非空。比如学号,员工编号。
unique:唯一,用于保证该字段的值具有唯一性,可以为空。比如:座位号。
check:检查约束(mysql中不支持),比如年龄,性别。
foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列,
在从表中添加外键约束,用于引用主表中某列的值,
比如:学生表的专业编号,员工表的部门编号,员工表的工种编号。
添加约束的时机:
一:创建表时,
二:修改表时
约束的添加分类:
列级约束:
六大约束语法都支持,但外键约束没有效果。
表级约束:
除了非空,默认,其他的都支持。
primary key(主键)和unique(唯一)的区别
外键的特点 重点
一:要求在从表设置外键关系
二:从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求。
三:主表的关联列必须是一个key(一般是主键或唯一)
四:插入数据时,先插入主表,再插入从表,删除数据时,先删除从表,再删除主表
create table 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
);
一:创建表时添加约束
**语法:**直接在字段名或类型后面追加,约束类型即可。
1:添加列级约束
create table stuinfo(
id int primary key, #主键
stuName varchar(20) not null, #非空
gender char(1) check(gender='男' or gender='女'), #检查
seat int unique, #唯一
age int default 18, #默认约束
majorId int references major(id) #外键
);
create table major(
id int primary key,
majorName cahrchar(20)
);
desc stuinfo;
查看sutinfo中的所有约束,包括主键,外键,唯一
show index from stuinfo;
二:添加表级约束
语法:
在各个字段的最下面
【constraint 约束名】 约束类型(字段名)
DROP TABLE
IF
EXISTS stuinfo;
CREATE TABLE stuinfo (
id INT,
stuName VARCHAR ( 25 ),
gender CHAR ( 1 ),
seat INT,
age INT,
majorId INT,
CONSTRAINT pk PRIMARY KEY ( id ),#主键
CONSTRAINT uq UNIQUE ( seat ),#唯一键
CONSTRAINT ck CHECK ( gender = '男' OR gender = '女' ),#检查
CONSTRAINT fk_stuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id ) #外键
);
CREATE TABLE stuinfo (
id INT,
stuName VARCHAR ( 25 ),
gender CHAR ( 1 ),
seat INT,
age INT,
majorId INT,
PRIMARY KEY ( id ),#主键
UNIQUE ( seat ),#唯一键
CHECK ( gender = '男' OR gender = '女' ),#检查
FOREIGN KEY ( majorId ) REFERENCES major ( id ) #外键
);
SHOW INDEX FROM stuinfo;
通用的写法:
CREATE TABLE
IF
NOT EXISTS tuinfo (
id INT PRIMARY KEY,
stuName VARCHAR ( 25 ) NOT NULL,
sex CHAR ( 1 ),
age INT DEFAULT 18,
majorId INT,
CONSTRAINT fk_tuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id )
);
二:修改表时添加约束
语法:
1:添加的列级约束
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 新约束;
2:添加表级约束
ALTER TABLE 表名 ADD 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
修改表时添加约束
DROP TABLE
IF
NOT EXISTS stuinfo;
CREATE TABLE STUINFO ( id INT, stuName VARCHAR ( 20 ), gender CHAR ( 1 ), seat INT, age INT, majorId INT );
DESC stuinfo;#添加非空约束
ALTER TABLE tuinfo MODIFY COLUMN stuname VARCHAR ( 20 ) NOT NULL;
约束练习题
添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR ( 20 ) NOT NULL;
添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
添加主键约束
# 列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY ( id );
添加唯一约束
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#表级约束
ALTER TABLE stuinfo ADD UNIQUE ( seat );
添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id );
三:修改表时删除约束
一:删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR ( 25 ) NULL;
删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
删除唯一键
ALTER TABLE stuinfo DROP INDEX seat;
删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY majorId;
show index from stuinfo;
常见的约束练习
向emp2的id列中添加primary key的约束(my_emp_id_pk)
alter table emp2 modify column id int primary key;
alter table emp2 add constraint my_emp_id_pk primary key(id);
向表dept2的id列中添加primary key 约束(my_dept_id_pk)
alter table dept2 add constraint my_dept_id_pk primary key(id);
标识列:又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值
标识列的特点:
一:标识列必须和主键搭配吗?不一定,但要求是一个key
二:一个表可以有几个标识列?至多一个
三:标识列的类型只能是数值型
四:标识列可以通过 set auto_increment=3;设置步长,
可以通过手动设置值,设置起始值。
创建表时设置标识列
drop table if exists tab_identity;
create table tab_identity(
id int primary key auto_increment,
name varchar(20)
);
二:修改表时设置标识列
alter table tab_identity mdify column id int primary key auto_increment;
三:修改表时删除标识列
alter table tab_identity modify column id int;