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)
)
复制代码

 

posted @   三三得九86  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示