今日内容 约束条件之主键和外键

  • 约束条件之主键

 一.primary主键

复制代码
1.单从约束角度上而言主键等价于非空且唯一 not null unique
        create table t1(
           id int primary key,
           name varchar(32)
        ); 
     2.InnoDB存储引擎规定一张表必须有且只有一个主键
        2.1.如果创建的表中没有主键也没有非空且唯一的字段 那么InnoDB存储引擎会自动采用一个隐藏的字段作为主键(主键可以加快数据查询:新华字典的目录)
           2.2.如果创建的表中没有主键但是有非空且唯一的字段 那么InnoDB存储引擎会自动将该字段设置为主键
            create table t2(
               nid int not null unique,
               sid int not null unique,
               uid int not null unique,
               name varchar(32)
            ); 
    3.创建表的时候都应该有一个'id'字段 并且该字段应该作为主键
            uid、sid、pid、gid、cid、id
复制代码

 

id int     primary key  单列主键

sid int    nid int    联合主键

 

二.auto_increment自增

该约束条件不能单独使用 必须跟在键后面(主要配合主键一起使用)
           create table t3(
                  id int primary key auto_increment,
                  name varchar(32)
            );

 

补充说明: 自增的特点

     自增的操作不会应为执行删除数据的操作而退回或者重置 如果非要重置主键,需要格式化表

     

truncate 表名; # 删除表数据并重置主键值

 

  • 约束条件之外键

一.外键的作用

外键字段主要是用来记录标语表之间数据的关系 而数据间的关系有三种:                                  

        一对一关系示例:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。

       一对多关系示例:一个学生只属于一个班,但是一个班级有多名学生。

       多对多关系示例:多对多就是双向一对多,一个学生可以选择多门课,一门课也有多名学生

二.foreign key外键

复制代码
1.先写普通字段
2.然后再写外键字段   

create table emp(
    id int primary key auto_increment,
     name varchar(32),
      gender enum('male','female','others') default 'male',
   dep_id int,
   foreign key(dep_id) references dep(id)
);
create table dep(
    id int primary key auto_increment,
       dep_name varchar(32),
    dep_desc varchar(32)
);
"""
1.创建表的时候需要先创建被关联的表(没有外键) 然后再是关联表(有外键)
2.插入表数据的时候 针对外键字段只能填写被关联表字段已经出现过的数据值
3.被关联字段无法修改和删除
    有点不太好 操作限制性太强
"""
复制代码
解决这种问题就需要 级联更新和级联删除
   on update cascade  # 级联更新 
   on delete cascade  # 级联删除
所以完整代码命令是
create table emp1(
    id int primary key auto_increment,
     name varchar(32),
      gender enum('male','female','others') default 'male',
   dep_id int,
   foreign key(dep_id) references dep1(id) 
   on update cascade  # 级联更新 
   on delete cascade  # 级联删除
);
create table dep1(
    id int primary key auto_increment,
       dep_name varchar(32),
    dep_desc varchar(32)
);
"""
扩展:
    在实际工作中 很多时候可能并不会使用外键
        因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
    我们为了能够描述出表数据的关系 又不想使用外键
        自己通过写SQL 建立代码层面的关系
"""
复制代码

复制代码

 

  •  表关系之多对多

复制代码
以书籍表和作者表为例
    1.先站在书籍表的角度
        问:一条书籍数据能否对应多条作者数据
       答:可以
    2.再站在作者表的角度
        问:一条作者数据能否对应多条书籍数据
       答:可以
    总结:两边都可以 那么表数据关系就是'多对多'
    针对多对多表关系 外键字段不能建在任意一方!!!
需要单独开设第三张关系表 存储数据关系
        create table book(
            id int primary key auto_increment,
           title varchar(32)
        );
       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 book(id) 
           on update cascade  # 级联更新 
           on delete cascade, # 级联删除
           author_id int,
           foreign key(author_id) references author(id) 
           on update cascade  # 级联更新 
           on delete cascade  # 级联删除
        );
复制代码
  • 表关系之一对一

复制代码
 针对'一对一'的表关系 外键字段建在任何一张表都可以 但是建议你建在查询频率较高的表中便于后续查询
   create table user(
           id int primary key auto_increment,
       name varchar(32)
       detail_id int unique,
       foreign key(detail_id) references userDetail(id) 
       on update cascade  # 级联更新 
       on delete cascade  # 级联删除
   );
    create table userDetail(
        id int primary key auto_increment,
       phone bigint
    );
复制代码

 

posted @   你好你好你好丶  阅读(77)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示