ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

mysql基础(一)三范式与约束

mysql基础(一)三范式与约束 数据库三范式第一范式1NF每一列都是不可再分的原子值不存在重复组或一列保存多个独立属性。实际表设计通常还应定义能够唯一标识记录的主键或候选键。第二范式2NF在1NF基础上要求所有非主键完全依赖主键。第三范式3NF在2NF基础上要求所有非主键列不能依赖于其他非主键列消除传递依赖。通俗讲就是非主键列之间不能存在“A→B→C”这种链条必须直接依赖于主键。五种约束主键、唯一、非空、默认、外键。如果是MySQL 8还有第六种CHECK首先创建两张表一张主表一张从表如下图红字为注释两张表的主键、外键、唯一约束都没有用CONSTRAINT指定约束名接下来就查看下两张表中的KEY。输入SHOW KEYS FROM fubiao查询父表中的key结果如图输入SHOW KEYS FROM zibiao查询子表中的KEY结果如图查询语句用index代替KEY结果也是一样如show index from fubiao,说明带KEY的约束创建的同时也有了索引。从以上结果可知在未使用constraint指定约束名的情况下主键KEY名默认为PRIMARY而唯一约束和外键约束KEY名默认为字段名因为主键只能有一个所以默认名为primary,而唯一约束和外键可以有多个所以默认为字段名。接下来我们对约束进行删除和添加测试。首先使用drop和add进行删除和添加输入ALTER TABLE fubiao DROP PRIMARY KEY删除父表中的主键结果报错因为父表中的主键和子表中外键相关联了先得删掉子表中的外键才能删除父表中的主键。输入ALTER TABLE zibiao DROP FOREIGN KEY wj_id删除子表中的外键结果又报错如图这是为什么呢其实KEY名索引名和约束名根本不是一回事输入SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_NAMEzibiao查看子表中的约束名和约束类型结果如下图查询出的两行数据第一行是主键约束名和KEY名相同第二行就是外键约束名与KEY名是不同的。一定要注意根据约束名删除而不是KEY名所以指定约束名很重要。输入ALTER TABLE zibiao DROP FOREIGN KEY zibiao_ibfk_1删除成功再次输入SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_NAMEzibiao查询子表中的约束类型和约束名结果显示只剩主键约束如下图子表外键已经删除成功接下来我们可以删除父表中的主键了输入ALTERTABLEfubiaoDROPPRIMARYKEY删除成功再依次删除其它约束ALTERTABLEfubiaoALTERCOLUMNsexDROPDEFAULT删除父表中的默认约束成功注意语句变化多了ALTER COLUMN sex。输入SELECTconstraint_type,constraint_nameFROMinformation_schema.table_constraintsWHEREtable_namefubiao查询父表中的约束类型和约束名得知唯一约束默认名为字段名如下图输入ALTER TABLE fubiao DROP UNIQUE KEY bianhao报错删除唯一约束的时候是不用带UNIQUE关键字的再次输入ALTERTABLEfubiaoDROPKEYbianhao删除成功。至此我们已经成功的删除了子表中的外键父表中的主键、默认约束、唯一约束。接下来再用ADD添加刚才删除了的约束。有了父表中的主键才能有子表中的外键所以我们先从主表开始。添加主键ALTERTABLEfubiaoADDPRIMARYKEY(id)添加默认约束ALTERTABLEfubiaoALTERCOLUMNsexSETDEFAULT男注意添加默认约束不是用add而是set。添加唯一约束ALTERTABLEfubiaoADDUNIQUE(bianhao)添加子表外键约束ALTERTABLEzibiaoADDCONSTRAINTwaijianFOREIGNKEY(wj_id)REFERENCESfubiao(id)还有个主表中的非空约束没有做增删测试因为非空必须用modify增删。删除主表name字段非空约束ALTERTABLEfubiaoMODIFYNAMEVARCHAR(10)添加name字段非空约束ALTERTABLEfubiaoMODIFYNAMEVARCHAR(10)NOTNULLmodify功能比较强大对其它约束也可以进行增加操作。先将子表外键删除、主表中的主键、唯一、默认等约束删除再用modify测试增加约束。其中默认约束可以用modify删除如ALTER TABLE fubiao MODIFY sex CHAR(10)。增加父表主键约束ALTERTABLEfubiaoMODIFYidINTPRIMARYKEY增加父表默认约束ALTERTABLEfubiaoMODIFYsexCHAR(8)DEFAULT女增加父表唯一约束ALTERTABLEfubiaoMODIFYbianhaoBIGINTUNIQUE以上测试都成功但是无法用modify增加外键约束。总结----创表之后对各种约束的增删方式如下一.删除方式1.主键删除ALTERTABLEfubiaoDROPPRIMARYKEY语句格式alter table 表名 drop primary key,需要注意的是有外键关联的情况下删除外键才能删除主键。2.外键删除ALTERTABLEzibiaoDROPFOREIGNKEYzibiao_ibfk_1语句格式alter table 表名 drop foreign key 外键约束名.3.唯一约束删除ALTERTABLEfubiaoDROPKEYbianhao语句格式ALTER TABLE 表名 DROP KEY 唯一约束名注意删除的时候是不用unique关键字的。4.默认约束删除ALTERTABLEfubiaoALTERCOLUMNsexDROPDEFAULT语句格式ALTER TABLE 表名 ALTER COLUMN 字段名 DROP DEFAULT。或者使用modifyALTERTABLEfubiaoMODIFYsexCHAR(10)语句格式ALTER TABLE 表名 MODIFY 字段名 字段类型将default省略就等于删除了默认约束添加时加上default就行。5.非空约束删除ALTERTABLEfubiaoMODIFYNAMEVARCHAR(10)语句格式ALTER TABLE 表名 MODIFY 字段名 字段类型。二.添加方式1.主键添加ALTERTABLEfubiaoADDPRIMARYKEY(id)语句格式ALTER TABLE 表名 ADD PRIMARY KEY(字段名)。或者使用modifyALTERTABLEfubiaoMODIFYidINTPRIMARYKEY语句格式ALTER TABLE 表名 MODIFY 字段名 字段类型 PRIMARY KEY2.外键添加ALTERTABLEzibiaoADDCONSTRAINTwaijianFOREIGNKEY(wj_id)REFERENCESfubiao(id)语句格式ALTER TABLE 子表名 ADD CONSTRAINT 外键约束名 FOREIGN KEY(字段名) REFERENCES 主表名(主表主键字段名)其中constraint 外键约束名可以省略。3.唯一约束添加ALTERTABLEfubiaoADDUNIQUE(bianhao)语句格式ALTER TABLE 表名 ADD UNIQUE(字段名)ALTERTABLEfubiaoMODIFYbianhaoBIGINTUNIQUE语句格式ALTER TABLE 表名 MODIFY 字段名 字段类型 UNIQUE4默认约束添加ALTERTABLEfubiaoALTERCOLUMNsexSETDEFAULT男语句格式ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT默认值注意此处不能用add而是set。ALTERTABLEfubiaoMODIFYsexCHAR(8)DEFAULT女语句格式ALTER TABLE 表名 MODIFY 字段名 字符类型 DEFAULT默认值5.非空约束增加ALTERTABLEfubiaoMODIFYNAMEVARCHAR(10)NOTNULL语句格式ALTER TABLE 表名 MODIFY 字段名 字段类型 NOT NULL非空约束只能用MODIFY进行增删默认约束可以用set、drop或者modify进行增删主键和唯一约束用drop进行删除用add或modify进行添加。外键只能用add增加drop删除modify只是对存在的字段属性进行有效操作不能对字段本身进行增删。add、drop可以对字段本身进行操作也就可以在增删字段的同时附带约束。
返回列表