一、外键foreign key
外键约束:
1、必须先创建被关联表才能创建关联表
2、插入记录时,必须先插入被关联表的记录,才能插入关联表(要用到被关联表)的记录
3、若不设置同步更新和同步删除,更新和删除都会受到限制
#表类型必须是innodb存储引擎,且被关联的字段,即references指定的另外一个表的字段,必须保证唯一 create table department( id int primary key, name varchar(20) not null )engine=innodb; #dpt_id外键,关联父表(department主键id),同步更新,同步删除 create table employee( id int primary key, name varchar(20) not null, dpt_id int, constraint fk_name foreign key(dpt_id) references department(id) on delete cascade #删除同步 on update cascade #更新同步 不写的话,被关联表的更新和删除都受到限制 )engine=innodb; #先往父表department中插入记录 insert into department values (1,'欧德博爱技术有限事业部'), (2,'艾利克斯人力资源部'), (3,'销售部'); #再往子表employee中插入记录 insert into employee values (1,'egon',1), (2,'alex1',2), (3,'alex2',2), (4,'alex3',2), (5,'李坦克',3), (6,'刘飞机',3), (7,'张火箭',3), (8,'林子弹',3), (9,'加特林',3) ; #删父表department,子表employee中对应的记录跟着删 mysql> delete from department where id=3; mysql> select * from employee; +----+-------+--------+ | id | name | dpt_id | +----+-------+--------+ | 1 | egon | 1 | | 2 | alex1 | 2 | | 3 | alex2 | 2 | | 4 | alex3 | 2 | +----+-------+--------+ #更新父表department,子表employee中对应的记录跟着改 mysql> update department set id=22222 where id=2; mysql> select * from employee; +----+-------+--------+ | id | name | dpt_id | +----+-------+--------+ | 1 | egon | 1 | | 3 | alex2 | 22222 | | 4 | alex3 | 22222 | | 5 | alex1 | 22222 | +----+-------+--------+
二、表的关联关系
关系有:
一对多 1-N、
多对多 N-N、
一对一 1-1、
实现:
1、员工与部门之间的关系是一对多的,用外键方式表示这种关系 foreign key(dep_id) references dep(id)
create table dep( id int primary key auto_increment, dep_name char(10), dep_comment char(60) ); create table emp( id int primary key auto_increment, name char(16), gender enum('male','female') not null default 'male', dep_id int, foreign key(dep_id) references dep(id) #员工与部门之间的关系是多对一的,用外键来表示这种关联关系 ); insert into dep(dep_name,dep_comment) values ('sb教学部','sb辅导学生学习,教授python课程'), ('外交部','老男孩上海校区驻张江形象大使'), ('nb技术部','nb技术能力有限部门'); insert into emp(name,gender,dep_id) values ('alex','male',1), ('egon','male',2), ('lxx','male',1), ('wxx','male',1), ('wenzhou','female',3);
2、作者与书之间是 N-N 的关系,一个作者可以写多本书,一本书可以被多个作者一起完成,
实现这种多对多关系,我们需要建立一个关系表,用来作为两张表关联的介质
create table author( id int primary key auto_increment, name char(16) ); create table book( id int primary key auto_increment, bname char(16), price int ); insert into author(name) values ('egon'), ('alex'), ('wxx') ; insert into book(bname,price) values ('python从入门到入土',200), ('葵花宝典切割到精通',800), ('九阴真经',500), ('九阳神功',100) ; #作者与书之间是 N-N 的关系,一个作者可以写多本书,一本书可以被多个作者一起完成, #实现这种多对多关系,我们需要建立一个关系表,用来作为两张表关联的介质 create table author2book( id int primary key auto_increment, author_id int, book_id int, foreign key(author_id) references author(id) on update cascade on delete cascade, foreign key(book_id) references book(id) on update cascade on delete cascade ); insert into author2book(author_id,book_id) values (1,3), (1,4), (2,2), (2,4), (3,1), (3,2), (3,3), (3,4);
3、客户成为学生,所以顾客与学生是一对一的,不会有多个客户成为一个学生,或者一个客户成为多个学生这种情况
对于一对一的关联关系,我们在学生表里加上外键,并且让该字段必须唯一
create table customer( id int primary key auto_increment, name char(20) not null, qq char(10) not null, phone char(16) not null ); #客户成为学生,所以顾客与学生是一对一的,不会有多个客户成为一个学生,或者一个客户成为多个学生这种情况 #对于一对一的关联关系,我们在学生表里加上外键,并且让该字段必须唯一 create table student( id int primary key auto_increment, class_name char(20) not null, customer_id int unique, #该字段一定要是唯一的 foreign key(customer_id) references customer(id) #外键的字段一定要保证unique on delete cascade on update cascade ); insert into customer(name,qq,phone) values ('李飞机','31811231',13811341220), ('王大炮','123123123',15213146809), ('守榴弹','283818181',1867141331), ('吴坦克','283818181',1851143312), ('赢火箭','888818181',1861243314), ('战地雷','112312312',18811431230) ; #增加学生 insert into student(class_name,customer_id) values ('脱产3班',3), ('周末19期',4), ('周末19期',5) ;
三、修改表
语法: 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; 2. 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; 3. 删除字段 ALTER TABLE 表名 DROP 字段名; 4. 修改字段 ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
四、清空表内容
第一种
delete from tb1; #强调:这条命令可以将表中的数据都删除,但是不能将id重置为0,当再次插入数据时会接着之前的id排序继续往下,所以该命令并不是真实的清空表
#删除操作快,但是无法恢复,不具备日志
第二种
truncate tb1; # 用以清空表,并将id置为0,删除数据可恢复
五、复制表
#复制表结构+记录 (key不会复制: 主键、外键和索引) mysql> create table new_service select * from service; #只复制表结构 mysql> select * from service where 1=2; #条件为假,查不到任何记录 Empty set (0.00 sec) mysql> create table new1_service select * from service where 1=2; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create table t4 like employees;