10月24日学习内容整理:自增约束条件,外键,修改表,复制表
一、自增auto_increment
》》》一个表中只能有1个自增字段,且必须约束为一个key
1、配置信息:针对所有表的配置
》》设置自增步长:auto_increment_increment
》》设置自增初始值:auto_increment_offset
(1)基于会话:会话就是一个连接,并且只改当前连接的设置
》set session auto_increment_increment=3 设置步长
》set session auto_increment_offset=2 设置初始值
(2)基于全局:该所有的连接的设置
》set global auto_increment_increment=3 设置步长
》set global auto_increment_offset=2 设置初始值
》》》》》》注意:改全局的话要想生效要先退出再重新登录
》》》》》》注意:若初始值大于步长,mysql会忽略初始值,初始值就不会生效,所以初始值要设置的比步长小或者相等步vhong
补充:show variables like '%incre%'; 查看mysql所有跟incre相关的配置信息,%意思是任意字符
2、设置表自带的属性:只针对一张表的设置
》在创建表的最后设置初始值,就是只改当前这种表的属性
二、外键 foreign key
1、基本用法:
》用来建立两张表之间的联系,要先创建被关联的表,再创建另一张表做关联
》做关联: foreign key(该表中要关联的字段) references 被关联的表名(被关联的字段名)
》在外键后加:
——>on delete cascade 表示被关联表删除自身记录时做关联的表相应的记录也被删除,也就是同步删除
——>on update cascade 表示对被关联的表中被关联的字段进行修改时做关联的表相应的记录也会被修改,也就是同步修改
2、关联分类:
(1)多对一(一对多):指的是左表的多条记录可以对应右表的1条记录或者右表的多条记录可以对应左表的1条记录两种情况只能满足一种
(单向foreign key)
=====================多对一===================== create table press( #被关联的表 id int primary key auto_increment, #被关联的字段,要求唯一 name varchar(20) ); create table book( #做关联的表 id int primary key auto_increment, name varchar(20), press_id int not null, foreign key(press_id) references press(id) #设置关联关系 on delete cascade #同步删除 on update cascade #同步修改 );
(2)多对多:以上两种情况都满足,这样就需要另一张表来存储两张表之间的关联关系并且与两张表都做关联
(双向foreign key)
=====================多对多===================== create table author( #作者表 id int primary key auto_increment, name varchar(20) ); create table book( #书表 id int primary key auto_increment, name varchar(20) ); #这张表就存放作者表与书表的关系,即查询二者的关系查这表就可以了 create table author2book( id int not null unique auto_increment, author_id int not null, book_id int not null, foreign key(author_id) references author(id) #分别设置和作者表的关联 on delete cascade on update cascade, foreign key(book_id) references book(id) #和书表的关联 on delete cascade on update cascade, primary key(author_id,book_id) #组合设置为主键 );
(3)一对一:左表的1条记录仅仅对应右表的1条记录并且反过来也是一样的
(必须把关联的字段设为unique唯一的约束条件)
create table customer( #客户表,要先创建,因为实际情况肯定是先有的客户再有的学生 id int primary key auto_increment, #被关联的字段也要是唯一的 name varchar(20) not null ); create table student( id int primary key auto_increment, name varchar(20) not null, class_name varchar(20) not null default 'python自动化', level int default 1, customer_id int unique, #该字段一定要是唯一的 foreign key(customer_id) references customer(id) #外键的字段一定要保证unique on delete cascade on update cascade );
3、怎么找关联关系:
》首先选择一张表,先站在这张表上考虑
》想清楚两张表的每条记录代表的是什么信息
》然后想各自记录的信息是否满足某种对应关系
》再站在另一张表的角度上重新考虑,最后确定是哪一种关联
》》》》》关于外键补充几点:
》》一对一的情况,因为要求关联的字段必须是唯一的,那也就是说被关联的字段也必须是唯一的,否则无法满足唯一性,因为被关联的字段不唯一的话关联的字段也不知道到底是关联到哪个
》》关联指的是做关联的字段值必须是被关联字段的值,不是的话是会报错的,并且做关联字段的约束条件要依据实际情况来定,不能和被关联字段有冲突导致无法取到被关联的字段值
》》无论是多对一还是多对多的概念,归根到底还是对多对一的理解,那么这个一其实就是代表着被关联的字段必须是不为空且唯一的,因为若不唯一的话就不满足一这个概念了而且做关联的字段也找不到具体关联的是哪个;若为空的话我觉得也就失去关联的意义了
》》多对一的情况,谁是一就先创建谁,一对一的要根据实际情况判断创建的先后顺序
三、修改表:
语法: 1. 修改表名 》ALTER TABLE 表名 RENAME 新表名; 2. 增加字段 》ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…]; 》ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…]; 》ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; first代表添加到第1个位置 》ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; after代表添加到某一个字段的后面 3. 删除字段 》ALTER TABLE 表名 DROP 字段名; 4. 修改字段 》ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; 》ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; 》ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; 示例: 1. 修改存储引擎 mysql> alter table service -> engine=innodb; 2. 添加字段 mysql> alter table student10 -> add name varchar(20) not null, -> add age int(3) not null default 22; mysql> alter table student10 -> add stu_num varchar(10) not null after name; //添加name字段之后 mysql> alter table student10 -> add sex enum('male','female') default 'male' first; //添加到最前面 3. 删除字段 mysql> alter table student10 -> drop sex; mysql> alter table service -> drop mac; 4. 修改字段类型modify mysql> alter table student10 -> modify age int(3); mysql> alter table student10 -> modify id int(11) not null primary key auto_increment; //修改为主键 5. 增加约束(针对已有的主键增加auto_increment) mysql> alter table student10 modify id int(11) not null primary key auto_increment; ERROR 1068 (42000): Multiple primary key defined mysql> alter table student10 modify id int(11) not null auto_increment; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 6. 对已经存在的表增加复合主键 mysql> alter table service2 -> add primary key(host_ip,port); 7. 增加主键 mysql> alter table student1 -> modify name varchar(10) not null primary key; 8. 增加主键和自动增长 mysql> alter table student1 -> modify id int not null primary key auto_increment; 9. 删除主键 a. 删除自增约束 mysql> alter table student10 modify id int(11) not null; b. 删除主键 mysql> alter table student10 -> drop primary key;
四、复制表
》》》》》注意:跟key有关的约束条件复制不了(primary key/unique/foreign key)
1、复制表结构和数据:
》create table 新表名 select * from 原表名 这样就是不仅复制了表结构也复制了表中所有的记录
》create table 新表名 select id,name from 原表名 这样就是复制表结构和表中指定字段的记录
2、只复制表结构
》create table 新表名 select * from 原表名 where 条件
这里的条件必须为假,找不到符合条件的记录就只复制表结构
》create table 新表名 like 原表名
like关键字就是为我们提供了只复制表结构的方法