
真正约束字段的是数据类型但是数据类型约束很单一需要有一些额外的约束更好的保证数据的合法性从业务逻辑角度保证数据的正确性。比如有一个字段是email要求是唯一的。表的约束很多这里主要介绍如下几个null/not null,default, comment, zerofillprimarykeyauto_incrementunique key 。表的约束一.空属性两个值null默认的和not null(不为空)数据库默认字段基本都是字段为空但是实际开发时尽可能保证字段不为空因为数据为空没办法参与运算。创建一个表关于一个班级的类型还有班级的教室的插入数据失败原因创建一个班级表包含班级名和班级所在的教室。站在正常的业务逻辑中如果班级没有名字你不知道你在哪个班级如果教室名字可以为空就不知道在哪上课所以我们在设计数据库表的时候一定要在表中进行限制满足上面条件的数据就不能插入到表中。这就是“约束”。二.default约束默认值默认值某一种数据会经常性的出现某个具体的值可以在一开始就指定好在需要真实数据的时候用户可以选择性的使用默认值。我们设定的默认值年龄18,性别男.设置 default 后用户插入了具体的数据就用用户所提供的数据。如果数据在插入的时候没有给该赋值那么就使用默认值。如果没有明确指定某一列要插入默认用是 default。在建表时对应列不能为空且默认没有设置 default 值则无法直接插入数据。当用户忽略某一列时使用 default 默认值如果设置了那么可以进行。如果没有设置 default 值则直接报错。null 和 not null主要是用来约束用户想插入的内容。default 和 not null 二者并不冲突而是相互补充的。注意只有设置 default 的列才可以在插入值时对列进行省(因为有默认值可以代替。age 没有 not null 的约束同时具有 default 默认值。总结用户想显式插入要么插入一个具体的值要么插入 NULL。字段设置了 NOT NULL那插入 NULL 就会被拦截。字段没有设置 DEFAULT那么插入时这一列就不能省略。如果在建表时没有设置 DEFAULT 默认值前提是没有设置 NOT NULL那么MySQL 会对 SQL 做优化默认加上 DEFAULT NULL。NOT NULL 和 DEFAULT 一般不需要同时出现有 DEFAULT 的字段如果同时允许 NULL显式插入 NULL 时仍然会变成 NULLDEFAULT 只在省略该列时生效记忆口诀NOT NULL 是“不能空”DEFAULT 是“空了给个值”。有 DEFAULT 就不用 NOT NULL没写 DEFAULT 也没写 NOT NULLMySQL 偷偷给你加 DEFAULT NULL。三. 列描述列描述comment没有实际含义专门用来描述字段会根据表创建语句保存用来给程序员或DBA来进行了解。我们会发现使用desc查不到注释信息也可以这样理解comment通过show进行查看四.zerofill刚开始学习数据库时很多人对数字类型后面的长度很迷茫。通过showt17看看表的建表语句这个是mysql8.0默认取消了后面的字段显示这里我用mysql5.7进行实验看到 int(10)这个代表什么意思呢整型不是 4 字节吗那这个 10 又代表什么呢int(10)里的10 不代表存储长度整型就是 4 字节范围是固定的。这个10 是显示宽度只在同时配合ZEROFILL补零时才有意义。说明int(10)表示当数值长度不足 10 位时在查询显示时用 0 补足到 10 位。但前提是字段必须加了ZEROFILL才会生效。如果不加ZEROFILL写int(10)和int(1)没有任何区别存的值范围都一样对列添加了 zerofill 属性后显示结果就有所不同。修改 t17 表的属性对b进行添加zerofill属性可以看到 b 的值由原来的 2 变成 0000000002这就是 zerofill 属性在起作用因为当你的宽度小于设定的宽度这里默认设置的是 10自动填充 0。但是MYSQL最后储存的还是2再看两组这是为什么hex()函数用于将参数转换成十六进制字符串。如果参数是数字整数或浮点数会先取整再转十六进制如hex(3.14)先取整为 3结果3如果参数是整数直接转十六进制如hex(200)结果C8输出格式化这里面的int(4)表示显示宽度插入数据不够就补0默认是10个宽度为什么默认是10个呢int(10)中的 10 是显示宽度不是存储长度MySQL 会根据该类型的最大值位数自动设置默认值——无符号 int 最大值 4294967295 是 10 位所以默认显示宽度为 10有符号 int 最大值是 10 位但负数多一个负号如 -2147483648 占 11 个字符所以默认显示宽度为 11。这个宽度只在配合ZEROFILL补零显示时才有意义不影响存储范围和占用空间。五.主键主键primary key用来唯一的约束该字段里面的数据不能重复不能为空一张表中最多只能有一个主键:主键所在的列通常是整数类型1.指定主键创建表的时候直接在字段上指定主键key 中 pri表示2.主键约束主键约束主键对应的字段中不能重复一旦重复操作失败。3.删除主键alter table 表名 drop primary key;4.追加主键当表创建好以后但是没有主键的时候可以再次追加主键alter table 表名 add primary key(字段列表)六.复合主键在创建表的时候在所有字段之后使用primary key(主键字段列表)来创建主键如果有多个字段作为主键可以使用复合主键。不能让两个主键的内容都是一样的这样会发生主键约束可以有一个相同也行七.自增长auto_incrementauto_increment当对应的字段不给值会自动的被系统触发系统会从当前字段中已经有的最大值1操作得到一个新的不同的值。通常和主键搭配使用作为逻辑主键。自增长的特点:任何一个字段要做自增长前提是本身是一个索引key一栏有值自增长字段必须是整数一张表最多只能有一个自增长插入数据id自动增值1插入数据LAST_INSERT_ID()返回的是当前连接中上一条 INSERT 语句实际插入的第一个自增值批量插入时不是最后一个而是第一个。索引在关系数据库中索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快可快速访问数据库表中的特定信息。八.唯一键约束一张表中有往往有很多字段需要唯一性数据不能重复但是一张表中只能有一个主键唯一键就可以解决表中有多个字段需要唯一性约束的问题。唯一键的本质和主键差不多唯一键允许为空而且可以多个为空空字段不做唯一性比较。关于唯一键和主键的区别我们可以简单理解成主键更多的是标识唯一性的。而唯一键更多的是保证在业务上不要和别的信息出现重复。假设一个场景(当然具体可能并不是这样仅仅为了帮助大家理解)比如在公司我们需要一个员工管理系统系统中有一个员工表员工表中有两列信息一个身份证号码一个是员工工号我们可以选择身份号码作为主键。而我们设计员工工号的时候需要一种约束而所有的员工工号都不能重复。具体指的是在公司的业务上不能重复我们设计表的时候需要这个约束那么就可以将员工工号设计成为唯一键。一般而言我们建议将主键设计成为和当前业务无关的字段这样当业务调整的时候我们可以尽量不会对主键做过大的调整。如果字段允许 NULL插入 NULL 是合法的且多个 NULL 之间不会产生唯一键冲突。主键一旦设置就不能与其他行的主键重复且主键字段不允许为 NULL。唯一键与主键类似都能保证字段值的唯一性区别在于唯一键允许为 NULL且多个 NULL 值互不冲突因为 NULL 不参与唯一性比较。需要注意SQL 中的 NULL 代表“未知值”与程序语言中的 null空对象含义不同两个 NULL 彼此不相等所以不会违反唯一约束。记忆主键不能为空唯一键可以为空且多个 NULL 不冲突因为 SQL 中的 NULL 表示“未知”两个未知值不认为是相同的。会发现不符合现实的逻辑哪有三个人电话一模一样的那么主键要保证唯一性同时并不否认其它列属性不需要唯一性如果也需要就得带上避免出现上述情况。唯一键约束不能重复但可以为 null。总结技术区别唯一键可以为空且允许多个 NULL主键不能为空。定位不同主键用于唯一标识表中的每一行记录是数据的“身份证”唯一键侧重于保证业务字段不重复如邮箱、手机号、身份证号防止用户插入冲突数据。互补关系二者并非对立而是互相补充。主键保障记录级别的唯一性唯一键保障字段级别的唯一性。一张表只能有一个主键但可以有多个唯一键。补充说明1. 主键的特点一张表只能有一个主键主键字段不能为 NULL主键值不能重复主键默认是聚簇索引InnoDB 中2. 唯一键的特点一张表可以有多个唯一键唯一键字段允许为 NULL且多个 NULL 互不冲突唯一键值不能重复NULL 除外唯一键默认是普通索引九.外键外键用于定义主表和从表之间的关系外键约束主要定义在从表上主表则必须是有主键约束或unique约束。当定义外键后要求外键列数据必须在主表的主键列存在或为null。外键的本质是一种引用约束用来保证两张表之间数据的逻辑一致性。语法foreign key (字段名) references 主表(列)创建主表创建从表:插入数据上面的表这里没有显示因为我重新创建了一个表当没有这个班级的时候就会显示报错你输入10超过范围创建一个id为空的学生删除班级理解外键外键约束的本质就是让数据库替你把关数据的“逻辑关系”。现实世界中的数据往往是相互关联的。比如学生和班级每个学生都应该属于一个真实存在的班级。如果不建外键只建两张独立的表就可能出现“学生表里填了 10 班但班级表里根本没有 10 班”的脏数据——这在业务上明显是矛盾的。外键的作用就是提前告诉 MySQL 这两张表之间的依赖关系。之后每次插入或修改MySQL 都会自动审核你填的班级 ID在班级表里到底存不存在不存在就报错拒绝操作。外键 把业务规则交给数据库来强制执行。十.综合案例有一个商店的数据记录客户及购物情况有以下三个表组成商品goods(商品编号goods_id商品名goods_name, 单价unitprice, 商品类别category, 供应商provider)客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex身份card_id)购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)要求每个表的主外键客户的姓名不能为空值邮箱不能重复客户的性别(男女)插入数据