MySQL—DDL操作2(约束、自增列)
知识大纲
- 约束[CONSTRAINTS]
- 自增列
学习任务
-
约束
- 约束的特点及分类
- 查看某个表的约束和索引
- 主键约束 PK
- 唯一键 UK
- 外键 FK
- 非空约束
- Default缺省约束
-
自增列
约束:CONSTRAINTS
1.约束的特点及分类
数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。数据的完整性要从以下四个方面考虑:
- 实体完整性(Entity Integrity):例如,同一个表中,不能存在两条完全相同无法 区分的记录
- 域完整性(Domain Integrity):例如:年龄范围 0-120,性别范围“男/女”
- 引用完整性(Referential Integrity):例如:员工所在部门,在部门表中要能找到这个部门
- 用户自定义完整性(User-defined Integrity):例如:用户名唯一、密码不能为空 等,本部门经理的工资不得高于本部门职工的平均工资的 5 倍。
根据约束的特点,分为几种:
- 键约束:主键约束、外键约束、唯一键约束
- Not NULL 约束:非空约束
- Check 约束:检查约束 MySQL不支持
- Default 约束:缺省约束
2.查看某个表的约束和索引
用途 | 语法 |
---|---|
查看表的约束信息 | SELECT * FROM information_schema.table_constraints WHERE table_name = ‘表名称’; |
查看表的索引信息 | SHOW INDEX FROM 表名称; |
查看表定义 | SHOW CREATE TABLE 表名; |
USE mysql01;
#查看表的约束信息[主外键][student] [informantin_schema.table_constraints]
select * from information_schema.table_constaints where table_name='student';
#查看表的索引信息
show index from student;
3.主键约束 PRIMARY KEY
主键:Primary key,简称 PK,数据库主键作用保证实体的完整性,可以是一个列或多列的组合。
-
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值,如果是多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
-
每个表有且最多只允许一个主键约束。
-
MySQL 的主键名总是 PRIMARY,就算自己命名了主键约束名也没用。
-
当创建主键约束时,MySQL 默认在对应的列上建立主键索引。删除主键时,也会直接删除主键索引。
如何建立主键
注意:创建主键后可在对应表上右键点击设计表,表中会出现一个带金色钥匙的符号。
如何删除主键
删除主键约束,不需要指定主键名,一个表只有一个主键
alter table 表名称 drop primary key;
#创建test1表 将其id列设置为主键:
#方式-1 [建表过程中添加PK]
create table test1
(
t_id varchar(10) primary key,
t_name varchar(20)
);
#方式-2 [建表过程中添加PK]
creat table test2
(
t_id varchar(10),
t_name varchar(20),
PRIMARY KEY(t_id)
);
select * from information_schema.table_constraints where table_name='test1';
select * from information_schema.table_constraints where table_name='test2';
#测试[test1]
INSERT INTO test1(t_id,t_name) VALUES('A1001','张三');
INSERT INTO test1(t_id,t_name) VALUES('A1002','李四');
INSERT INTO test1(t_id,t_name) VALUES('A1003','王五');
INSERT INTO test1(t_id,t_name) VALUES('A1005',NULL);
INSERT INTO test1(t_id,t_name) VALUES(NULL,'赵六'); -- 报错
select * from test1;
#创建组合[复合]主键 [建表过程中添加组合PK]
CREATE TABLE test3
(
t_id INT,
t_name VARCHAR(20),
t_sex CHAR(2),
PRIMARY KEY(t_id,t_name)
);
INSERT INTO test3 VALUES(1001,'张三','男');
INSERT INTO test3 VALUES(1002,'张三','男');
INSERT INTO test3 VALUES(1002,'李四','男');
SELECT * FROM test3;
#alter table 表名称 add [constraint 约束名] primary key (字段名);
CREATE TABLE test4
(
t_id INT,
t_name VARCHAR(20),
t_sex CHAR(2)
);
#在表被创建好之后 修改表 添加约束
alter table test4 add constraint PK_TEST4_ID primary key(t_id);
CREATE TABLE test5
(
t_id INT,
t_name VARCHAR(20),
t_sex CHAR(2)
);
alter table test5 add constraint PK_TEST5_ID_NAME primary key(t_id,t_name);
#删除表中主键约束
alter table test5 drop primary key;
alter table test4 drop primary key;
当主键是多个列的组合时,只要这些列都不为空值(三列,两列都为空会报错 三列都为空会报错,并且组合的值不完全一样就行。
4.唯一键 Unique key,简称 UK
- 同一个表可以有多个唯一约束。
- 唯一约束可以是某一个列的值唯一,也可以多个列组合值的唯一。
- MySQL会给唯一约束的列上默认创建一个唯一索引。
- 删除唯一键只能通过删除唯一索引的方式删除,删除时需要指定唯一索引名, 唯一索引名就是唯一约束名一样。
如何建立唯一性约束
如何删除唯一性约束
ALTER TABLE 表名称 DROP INDEX 唯一性约束名
#注意:如果忘记名称,可以通过查看表的约束或索引的方式查看
组合列唯一性约束也是只要组合值不完全相同就行(null除外)
#创建表test6 在其t_name列上创建唯一约束[UK][建表时添加唯一约束]
create table test6
(
t_id INT,
t_name VARCHAR(20) UNIQUE,
t_sex CHAR(2)
);
INSERT INTO test6 VALUES(1001,'张三','男');
INSERT INTO test6 VALUES(1002,'张三','男');
SELECT * FROM test6;
CREATE TABLE test7
(
t_id INT,
t_name VARCHAR(20),
t_sex CHAR(2),
constraint UK_TEST7_NAME UNIQUE KEY(t_name)
);
INSERT INTO test7 VALUES(1001,'张三','男');
INSERT INTO test7 VALUES(1002,'张三','男');
SELECT * FROM test7;
CREATE TABLE test8
(
t_id INT,
t_name VARCHAR(20),
t_sex CHAR(2),
CONSTRAINT UK_TEST8_NAME UNIQUE KEY(t_name,t_sex)
);
INSERT INTO test8 VALUES(1001,'张三','男');
INSERT INTO test8 VALUES(1002,'张三','女');
SELECT * FROM test8;
INSERT INTO test8 VALUES(1003,'张三',NULL);
INSERT INTO test8 VALUES(1004,NULL,'女');
INSERT INTO test8 VALUES(1005,'张三',NULL); -- 此时你会发现有两个张三 null 但是没有报错
#建表后添加唯一约束
CREATE TABLE test9
(
t_id INT,
t_name VARCHAR(20),
t_sex CHAR(2)
);
alter table test9 add constraint UK_TEST9_ID unique key(t_id);
CREATE TABLE test10
(
t_id INT,
t_name VARCHAR(20),
t_sex CHAR(2)
);
alter table tenst10 add constraint UK_TEST10_NAME_SEX unique key(t_name,t_sex);
#删除唯一约束[index]
alter table test9 drop index UK_TEST9_ID;
alter table test10 drop index UK_TEST10_NAME_SEX;
CREATE TABLE test11
(
t_id INT,
t_name VARCHAR(20) UNIQUE,
t_sex CHAR(2) UNIQUE
);
CREATE TABLE test12
(
t_id INT,
t_name VARCHAR(20) UNIQUE NOT NULL,
t_sex CHAR(2) UNIQUE
);
5.外键:Foreign key,简称 FK
-
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或者是两个表的两个字段之间的参照关系。
-
在创建外键约束时,如果不给外键约束名称,默认名不是列名,而是自动产生一个外键名,也可以指定外键约束名。
-
当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。索引名是外键的约束名。
-
删除外键时,关于外键的普通索引需要单独删除。
注意:
-
在从表上建立外键,而且主表要先存在
-
从表的外键列,在主表中引用的只能是键列(主键,唯一键,外键)。
-
从表的外键列于主表悲惨在的列名字可以不相同,但是数据类型不许一样。
-
一个表可以建立多个外键约束。
-
从表的外键值必须在须”在主表中能找到”或者为空,从而约束了从表的外键列的值的添加和修改。
-
当主表的记录被从表参照时,主表中被参考记录的删除和更新也会受到限制。
-
如果要删除表,需要先删除从表,才能删除主表。
-
a.默认情况下,主表和从表是严格依赖关系 RESTRICT。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
b.但是有一种是级联“修改、删除”:
-
ON DELETE SET NULL(级联置空):当外键设置了SET NULL,当主表的相关记录删除时,从表对应的字段改为NULL。注意从表外键字段得允许为空才行。
-
ON DELETE CASCADE(级联删除)当外键设置了CASCADE(级联),当主表的相关记录删除时,从表对应的行都删除了。
-
对于外键约束,最好是采用:ON UPDATE CASCADE ON DELETE RESTRICT的方式。
如何建立外键约束
如何删除外键约束
ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;
如何删除外键列上的索引
ALTER TABLE 表名称 DROP INDEX 外键列索引名;
/*
图书总表[book]
b_id[主键] b_name b_price b_numbers
学生信息表[stuinfo]
s_id[主键] s_name s_sex s_age
图书借阅表[readbook]
r_id[主键] r_time b_id[外键] s_id[外键]
*/
CREATE TABLE book
(
b_id VARCHAR(20),
b_name VARCHAR(20),
b_price FLOAT,
b_numbers INT,
primary key(b_id)
);
CREATE TABLE stuinfo
(
s_id VARCHAR(20),
s_name VARCHAR(20),
s_sex CHAR(2),
s_age INT,
primary key(s_id)
);
CREATE TABLE readbook
(
r_id VARCHAR(20),
r_time TIMESTAMP,
b_id VARCHAR(20),
s_id VARCHAR(20),
primary key(r_id),
constraint FK_RB_BID foreign key(b_id) references book(b_id)
on update cascade on delete restrict,
constraint FK_RB_SID foreign key(s_id) references stuinfo(s_id)
on update cascade on delete restrict
);
INSERT INTO book VALUES('A100101','《Java编程思想》',98,50);
INSERT INTO book VALUES('A100102','《MySQL删库逃亡》',66.5,80);
INSERT INTO book VALUES('B100101','《大数据底层结构》',99,10);
INSERT INTO book VALUES('C100101','《网络爬虫技术》',56,100);
INSERT INTO stuinfo VALUES('W1001','张三','男',17);
INSERT INTO stuinfo VALUES('W1002','李四','女',18);
INSERT INTO stuinfo VALUES('W1003','王五','男',20);
INSERT INTO stuinfo VALUES('Q1001','赵六','女',19);
INSERT INTO readbook VALUES('R1001001','2020_08_10 09:05:01','A100101','W1002');
INSERT INTO readbook VALUES('R1001002','2020_08_11 10:05:01','A100102','Q1001');
#INSERT INTO readbook VALUES('R1001003','2020_08_11 11:05:01','B100101','Q1010');
#INSERT INTO readbook VALUES('R1001004','2020_08_11 10:05:01','A100112','Q1001');
#删除测试表[先删从表 再删主表]
DROP TABLE readbook;
DROP TABLE book;
DROP TABLE stuinfo;
CREATE TABLE book
(
b_id VARCHAR(20),
b_name VARCHAR(20),
b_price FLOAT,
b_numbers INT
);
CREATE TABLE stuinfo
(
s_id VARCHAR(20),
s_name VARCHAR(20),
s_sex CHAR(2),
s_age INT
);
CREATE TABLE readbook
(
r_id VARCHAR(20),
r_time TIMESTAMP,
b_id VARCHAR(20),
s_id VARCHAR(20)
);
#建表后添加主键约束
alter table book add constraint PK_BOOK_BID primary key(b_id);
alter table stuinfo add constraint PK_STUINFO_SID primary key(s_id);
alter table readbook add constraint PK_READBOOK_RID primary key(r_id);
#建表后添加外键约束
alter table readbook add constraint FK_READBOOK_BID foreign key(b_id) references book(b_id);
alter table readbook add constraint FK_READBOOK_SID foreign key(s_id) references stuinfo(s_id);
#删除外键约束
alter table readbook drop foreign key FK_READBOOK_BID;
alter table readbook drop foreign key FK_READBOOK_SID;
#删除外键约束产生的普通索引 [外键索引名 即:约束名]
alter table readbook drop index FK_READBOOK_BID;
alter table readbook drop index FK_READBOOK_SID;
#删除主键约束
ALTER TABLE book DROP PRIMARY KEY;
ALTER TABLE stuinfo DROP PRIMARY KEY;
ALTER TABLE readbook DROP PRIMARY KEY;
6.非空约束
NOT NULL 非空约束,规定某个字段不能为空
CREATE TABLE t_stu(
sid INT PRIMARY KEY,
sname VARCHAR(100) NOT NULL
);
7. Default 缺省约束
default:默认值,在插入数据时某列如果没指定其他的值,那么会将默认值添加到新记 录。
8.自增列:AUTO_INCREMENT
CREATE TABLE t_stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(100) NOT NULL,
gender CHAR NOT NULL DEFAULT ‘男’,
birthday DATE,
address VARCHAR(200)
);
关于自增长 auto_increment:
- 整数类型的字段才可以设置自增长。
- 当需要产生唯一标识符或顺序值时,可设置自增长。
- 一个表最多只能有一个自增长列。
- 自增长列必须非空。
- 自增长列必须是主键列或者唯一键列。
- InnoDB 表的自动增长列可以手动插入,但是插入的值如果是空或者 0,则实际 插入的将是自动增长后的值。
8.自增列:AUTO_INCREMENT
CREATE TABLE t_stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(100) NOT NULL,
gender CHAR NOT NULL DEFAULT ‘男’,
birthday DATE,
address VARCHAR(200)
);
关于自增长 auto_increment:
- 整数类型的字段才可以设置自增长。
- 当需要产生唯一标识符或顺序值时,可设置自增长。
- 一个表最多只能有一个自增长列。
- 自增长列必须非空。
- 自增长列必须是主键列或者唯一键列。
- InnoDB 表的自动增长列可以手动插入,但是插入的值如果是空或者 0,则实际 插入的将是自动增长后的值。