09_03、约束条件和外键
一、约束条件
# 1. unsigned 无符号 create table t1 (id int unsigned); # 2. zerofill 用0填充 create table t2 (id int zerofill); insert into t2 values (1); insert into t2 values (111111); create table t3 (id int); # 3. default 默认 create table t4 ( id int, gender enum('male','female') default 'male' ); # 4. unique 唯一 create table t5 (id int, ip varchar(16)); # 单列唯一 create table t6 (id int, ip varchar(16) unique); # 多列唯一 create table t7 ( id int, ip varchar(16), port int, unique(ip, port) ); # 5. not null 非空,不能为空 create table t8 (id int, name varchar(16) not null); # 6. 主键 (primary key) ''' 1. 在数据控制上面,主键相当于非空且唯一 id int primary key == id int not null unique 2. InnoDB存储引擎要求每一张表必须有一个主键,之前的InnoDB存储引擎也没有指定主键,但是表也创建成功了,为什么? 是因为InnoDB引擎有一个默认的主键,而这个默认的主键只是帮助我们把表创建成功,并且是隐藏的主键,不能用。 主键的另外一个主要作用是:可以帮助我们提高查询速度 3. 以后我们自己创建表的时候,主动指定主键, 结论:id int primary key ''' # 7. auto_increment # 自动递增 # 自增,你就理解为是配合主键使用的 id int unsigned primary key auto_increment # 终极版本 create table t9 ( id int primary key auto_increment, name varchar(16) );
二、外键
1、清理数据的两种方式
delete from t1; # 不影响主键 truncate t1; # 会影响主键的
2、外键定义
建立两张表之间的关系的中间桥梁
3、外键的三种应用场景
1. 一对多
2. 多对多
3.一对一
4、如何判断表关系
# 如何判断表关系 # 一对多的判断? """ 以图书表和出版社表为例 1. 站在两张表的角度,分别问一个问题,一本图书能不能有多个出版社?不能 2. 一个出版社能不能有多个图书?能 结论:如果一个能,一个不能,那么表关系就是'一对多' 针对一对多的关系,外键字段健在多的一方 """ # 多对多的判断? """ 以图书和作者表为例 1. 站在图书表角度 问:一个图书能否有多个作者写? 答:可以 2. 站在作者表的角度 问:一个作者能否写多本书 答:可以 结论:如果两边都可以,那么,表关系就是多对多 针对,多对多关系,外键字段不健在任何一方 而是,健在第三张表中 """ # 一对一关系判断 """ 以作者表和作者详情表为例 1. 站在作者表角度 问:一个作者能否有多个作者详细? 答:不可以 2. 站在作者详情表的角度 问:一个作者详情能否有多个作者 答:不可以 结论:两边都不能,那就是一对一,或这没有关系 针对,一对一关系,外键字段健在任何一方都可以,推荐在使用频率比较高的一张表 """
5、SQL语句实现
####################################一对多########################################## 1. 一对多的关系 # 1.在创建表关系的时候,先创建基础字段 # 2.在创建外键关系 # 3. 先创建没有外键的一张表 # 4. 录入数据的时候先录入没有外键的一张表 create table book ( id int primary key auto_increment, title varchar(64), price decimal(8, 2), publish_id int, Foreign key(publish_id) references publish(id) ); create table publish ( id int primary key auto_increment, name varchar(32) ) ####################################多对多########################################## create table book ( id int primary key auto_increment, title varchar(64), price decimal(8, 2) ); create table author ( id int primary key auto_increment, name varchar(32) ); create table book2author ( id int primary key auto_increment, book_id int, Foreign key(book_id) references author(id) on update cascade on delete cascade, author_id int, Foreign key(author_id) references book(id) on update cascade on delete cascade ); ###############################一对一###################################### create table author2 ( id int primary key auto_increment, name varchar(64), author_detail_id int unique, Foreign key(author_detail_id) references author_detail(id) ); create table author_detail ( id int primary key auto_increment, name varchar(32) )
6、级联更新级联删除
create table book ( id int primary key auto_increment, title varchar(64), price decimal(8, 2), publish_id int, Foreign key(publish_id) references publish(id) on update cascade on delete cascade ); create table publish ( id int primary key auto_increment, name varchar(32) )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通