MySQL【表的约束下】
一、自增长auto_increment是自动为数字字段生成唯一值的约束通常与主键搭配使用作为逻辑主键与业务无关的唯一标识其核心特性为自增长字段必须是索引key 一栏有值主键本身是索引因此可直接搭配自增长字段必须是整数类型一张表最多只能有一个自增长字段插入数据时不给自增长字段赋值会自动被系统触发系统会从当前最大值 1 生成新值。案例查找建表描述我们可以看到当插入数据时指定id为1000 系统的自增值的起始位值会变化指定id插入数据到表中如果合法会自动插入数据再次select * from t8 时候表格以升序把数据整理好 但是auto_increment 还是当前表中的最大值 1可以在建表的时候指定表的自增值如下在插入后获取上一次的AUTO_INCREMENT的值批量插入获取的是第一个值1. 一本书的目录 他所存在的价值就是 快速查找内容 可以目录存在多页虽然牺牲了很多纸张 但是提高了我们查找某一个章节的速度 。2. 同样的 如果数据库的表过于大 我们可以再开辟一段空间 维护内容 与 数据页码之间的关系3. 索引它是用空间换取时间二、唯一键实际业务中一张表往往有多个字段需要唯一性约束但主键只能有一个此时可通过unique key实现其核心特性为唯一键字段不能重复但允许为空且多个空值不做唯一性比较一张表可以有多个唯一键主键侧重标识记录的唯一性唯一键侧重保证业务字段的唯一性。主键和唯一键是互相补充的。一张表只能有一个主键但可以有多个唯一键。因此唯一键是对主键的补充用于约束其他需要唯一性的字段。我们先来看一下unique 当插入id值相同的时候 unqiue属性约束了插入数据id不可重复则拒绝插入数据唯一键的值可以为NULL为了更加深刻的理解unique这个约束的意义再来举一个例子这个完全就属于数据库设计不好的例子了在实际的生活中 不同的人拿着身份证申请的号码是唯一的不重复的唯一键是保证业务字段唯一性的重要手段它帮助我们将业务规则下沉到数据库层面让数据存储自身具备校验能力避免因应用层疏忽导致的数据混乱。在设计表结构时凡是业务上要求唯一的字段如手机号、邮箱、身份证号等都应考虑使用唯一键进行约束。修正主键与唯一键的区别特性主键primary key唯一键unique key唯一性唯一唯一非空性必须非空允许为空数量限制一张表一个一张表多个核心作用标识记录唯一性保证业务字段唯一性一个保证记录唯一性一个保证业务逻辑上的唯一性 主键只能有一个~三、外键谈一个概念生活中如果有一张表表中的数据不是孤立的可能与其他表有关系我们的MYSQL是关系型数据库所以表与表之间存在一定的关系 , 所以表与表之间需要存在约束来规范外键是用于定义主表和从表之间关联关系的约束能保证从表的数据与主表的一致性解决数据冗余和数据不一致问题其核心特性为外键约束定义在从表上主表必须有主键或唯一键从表的外键字段值必须在主表的主键 / 唯一键中存在或为 null建立外键的本质将表之间的关联关系交给 MySQL 审核拒绝插入不符合业务逻辑的数据。语法FOREIGN KEY (从表字段) REFERENCES 主表(主表字段)案例学生表从表班级表主表外键需要考虑表与表之间的关联关系关联约束以下两个场景是不符合实际情况的例子MYSQL需要在技术层面上规避这种不合理的情况发生 。 修改从表设置外键当试图插入一个不存在的班级编号时数据库会报错从而保证了数据的有效性。建立外键的本质其实就是把相关性交给mysql去审核了提前告诉mysql表之间的约束关系那么当用户插入不符合业务逻辑的数据的时候mysql不允许你插入。四、综合案例 - 阅读学习了所有约束后我们结合商店购物的实际业务场景设计商品、客户、购买三张表综合运用上述所有约束实现数据的完整性和逻辑性保障。业务需求包含商品表、客户表、购买表表之间通过外键关联每张表设置自增长主键客户姓名不能为空邮箱和身份证号唯一客户性别仅允许 “男 / 女”商品名、供应商不能为空单价默认 0购买数量默认 0关联的客户 ID 和商品 ID 必须存在。-- 1. 创建数据库指定字符集 create database if not exists bit32mall default character set utf8 ; -- 2. 选择数据库 use bit32mall; -- 3. 创建商品表主表 create table if not exists goods ( goods_id int primary key auto_increment comment 商品编号, goods_name varchar(32) not null comment 商品名称, unitprice int not null default 0 comment 单价单位分, category varchar(12) comment 商品分类, provider varchar(64) not null comment 供应商名称 ); -- 4. 创建客户表主表 create table if not exists customer ( customer_id int primary key auto_increment comment 客户编号, name varchar(32) not null comment 客户姓名, address varchar(256) comment 客户地址, email varchar(64) unique key comment 电子邮箱唯一, sex enum(男,女) not null comment 性别仅允许男/女, card_id char(18) unique key comment 身份证号唯一 ); -- 5. 创建购买表从表外键关联客户表和商品表 create table if not exists purchase ( order_id int primary key auto_increment comment 订单号, customer_id int comment 客户编号, goods_id int comment 商品编号, nums int default 0 comment 购买数量, -- 外键关联客户表 foreign key (customer_id) references customer(customer_id), -- 外键关联商品表 foreign key (goods_id) references goods(goods_id) );MySQL 的表约束是保障数据质量的核心手段不同约束各司其职从基础到核心形成了完整的约束体系基础约束null/not null非空、default默认值、comment注释、zerofill零填充完善字段的基本属性唯一性约束primary key主键、unique key唯一键、auto_increment自增长保证表内数据的唯一性关联性约束foreign key外键保证表之间数据的一致性解决数据冗余和脏数据问题。