六、自增长
设置自增长属性的字段,插入数据时若不给该字段值,那么系统会自动找出当前字段中已有的最大值,将最大值进行加一后的值插入该字段
任何一个字段要做自增长,前提是其本身必须是一个索引(Key一栏有值),且自增长字段必须是数值类型,一张表最多只能有一个自增长字段
自增长通常和主键搭配使用,作为逻辑主键。建议将主键设计成与当前业务无关的字段,避免因为业务逻辑调整而修改主键
如创建一个表,表中包含id和name,将id同时设置成主键和自增长字段
创建表完毕后查看表结构,可以看到id的Extra列中出现了auto_increment标志
向表中插入第一条记录时若没有指明自增长字段的值,那么自增长字段的值默认将会从1开始
后续向表中插入记录时若也不指明自增长字段的值,那么自增长字段的值就会依次递增
插入记录时也可指明自增长字段的值,此时将会使用该值进行插入,但指明的值不能和表中已有的值重复
此后向表中插入时若又不指明自增长字段的值,那么自增长字段的值将会找出最大值,将最大值加一后得到的值作为自增长字段的值插入
一般自增长字段设置后就不需手动为该字段插入值了,直接让其从1开始进行自增长即可
七、唯一键
一张表中往往有很多字段需要唯一性,但一张表中只能有一个主键,而唯一键就可以解决表中有多个字段需要唯一性约束的问题
唯一键和主键都能保证字段中数据的唯一性,但唯一键允许字段为空,并且可以多个字段为空,空字段不做唯一性比较
不是主键具有唯一性,而是某个具有唯一性的字段被选择成为了主键,而那些不是主键但是同样需要唯一性约束的字段就应设置成唯一键
创建一个学生表,表中包含学生的id、姓名和电话号码,将选择id作为主键,但电话号码也应具有唯一性约束,因此将电话号码设置成唯一键
表创建完毕后查看表结构,可以看到iphone的Key列出现了UNI标志,这表明其已经成功被设置成唯一键
向表中插入记录时,若插入记录中的电话号码与表中已有记录的电话号码出现重复,那么就会因为唯一键冲突而插入失败
向表中插入的记录可以不指明唯一键字段的值,此时该字段默认为空,不做唯一性比较
八、外键
外键用来定义主表和从表之间的关系,外键约束主要定义在从表上,主表必须有主键约束或唯一键约束
外键定义后,要求插入外键列的数据必须在主表对应的列存在或为null
如先创建一个班级表作为主表,表中包含班级的id和班级名,并将班级id设置为主键
再创建一个学生表作为从表,表中包含学生的id、姓名和学生所在班级对应的id,并将学生表中的班级id列设置成外键,关联班级表中的班级id列
表创建完毕后查看学生表的表结构,可以看到学生表中的班级id对应的Key列出现了MUL标志,这表明class_id已经成功被设置成了外键
为了演示外键约束,先向班级表中插入两条记录
向学生表中插入记录时,若插入的记录对应的班级id是班级表中存在的,或者插入的班级id为null,那么此时是允许进行插入的
但若插入学生表的记录对应的班级id是3或不指定,相当于插入学生表的这条记录对应的班级并不存在,此时将会插入失败,这就是外键约束
若向班级表中插入班级id为3的班级信息,然后再向学生表中插入上述记录,这时就允许插入了
创建班级表和学生表后就算不设置外键,在语义上其实也已经有了外键,但这样没办法保证后续插入学生表的记录中的班级id的正确性
而给学生表中的班级id设置成外键后,外键约束就能保证只有班级id在班级表中存在的记录才能插入学生表,否则就会插入失败
实际建立外键的本质就是把相关性交给MySQL去审核了,提前告诉MySQL表之间的约束关系,当用户插入不符合业务逻辑的数据时,MySQL就不允许插入