• 数据库的约束和设计


    约束

    • 作用
      • 对表中的数据进行进一步的限制, 保证数据的正确性, 有效性和完整性
    • 种类
      • primary key : 主键约束
      • unique : 唯一约束
      • not null : 非空约束
      • default : 默认值
      • foreign key : 外键约束
      • auto_increment : 自增约束(适用于int数据类型)

    主键约束

    • 特点
      • 非空且唯一
    • 注意事项
      • 通常不用业务字段作为主键, 单独给每张表设计一个id的字段, 把id作为主键; 主键是给数据库和程序使用的, 不是给最终的客户使用的; 所以主键有没有含义没有关系, 只要不重复, 非空就行
      • 每张表都应该有一个主键, 并且每张表只能有一个主键(可以一组字段作为一张表的主键)
    1. 在创建表的时候给字段添加主键
    create table 表名 (
    	字段名 数据类型 primary key,
    	字段名 数据类型,
    	字段名 数据类型
    );
    create table 表名 (
    	字段名1 数据类型,
    	字段名2 数据类型,
    	字段名3 数据类型,
    	primary key(字段名1, 字段名2)
    );
    
    2. 在已有表中添加主键
    alter table 表名 add primary key(字段名);
    alter table 表名 add primary key(字段名1, 字段名2);
    

    自增约束(主键自增)

    • 作用
      • 能够设置主键为自动增长
      • 主键如果让我们自己添加很有可能重复, 我们通常希望在每次插入新记录时, 数据库自动生成主键字段的值
    • 注意事项
      • 只能给主键添加约束
      • 只能给一列添加自增约束
    -- 示例1
    create table test1 (
      id int primary key auto_increment,
      name varchar(10),
      age int
    );
    -- 示例2
    alter table test1 modify id int primary key auto_increment;
    alter table test1 modify id int auto_increment;
    

    默认值

    • 注意事项
      • 主动插入null 不会被默认值替换
    create table test1 (
      id int ,
      name varchar(10),
      age int default 18
    );
    
    insert into test1(name, age) values('11', null); -- (null, 11, null)
    insert into db4.test1(name) values('22'); -- (null, 22, 18);
    

    表的关系和外键约束

    • 表的关系分为一对一, 一对多和多对多, 在处理多对多关系时我们需要引入第三张表, 作为多对多两张表的桥梁
    • 第三张表需要引入其余两张表的主键作为自己表中的外键
    -- 前置条件
    create table tb_order (
      id int primary key auto_increment,
      payment double(10, 2),
      payment_type tinyint,
      status tinyint
    );
    
    create table tb_goods (
      id int primary key auto_increment,
      title varchar(100),
      price double(10, 2)
    );
    
    create table tb_order_goods (
      id int primary key auto_increment,
      order_id int,
      goods_id int,
      count int
    );
    
    alter table 表名 add [constraint 约束名称]
    foreign key(当前表中的列名) references 被引用的表名(被引用表的列名);
    
    -- 完整写法(给已经存在的表添加外键约束)
    alter table tb_order_goods add constraint fk_order_id
    foreign key(order_id) references tb_order(id);
    
    alter table tb_order_goods add constraint fk_goods_id
    foreign key(goods_id) references tb_goods(id);
    
    -- 省略写法(给已经存在的表添加外键约束)
    alter table tb_order_goods add
    foreign key(order_id) references tb_order(id);
    
    alter table tb_order_goods add
    foreign key(goods_id) references tb_goods(id);
    
    -- 完整写法((创建表时就添加外键约束))
    create table tb_order_goods (
      id int primary key auto_increment,
      order_id int,
      goods_id int,
      count int,
      constraint fk_order_id foreign key(order_id) references tb_order(id),
      constraint fk_goods_id foreign key(goods_id) references tb_goods(id)
    );
    
    -- 省略写法(创建表时就添加外键约束)
    create table tb_order_goods (
      id int primary key auto_increment,
      order_id int,
      goods_id int,
      count int,
      foreign key(order_id) references tb_order(id),
      foreign key(goods_id) references tb_goods(id)
    );
    

    在这里插入图片描述

    • 注意事项
      • 添加数据需要先添加主表, 然后添加从表
      • 删除数据需要先删除从表, 然后再删除主表
  • 相关阅读:
    TabLayout+Fragment+ViewPager实现Tab页面效果
    unity中压缩文件与解压文件
    c++/VS XP系统 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll解决方案
    centos安装docker和docker-compose
    实战|如何低成本训练一个可以超越 70B Llama2 的模型 Zephyr-7B
    SpringBoot整合MongoDB以及副本集、分片集群的搭建
    Git协同开发
    开发chromium你要知道的几个地址
    一文读懂 Shiro 登录认证全流程
    nvidia-smi常用选项汇总
  • 原文地址:https://blog.csdn.net/XiaoBoYes/article/details/127122448