主键不唯一
由于表定义中创建了主键约束,因此MySQL将会确保重复主键不会被插入到数据表中。
INSERT INTO person
(person_id, fname, lname, gender, birth_date)
VALUES (1, 'Zifeiy2', 'Haha', 'M', '1991-01-06');
报错:
[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'
不存在的外键
favorite_food的表定义再person_id列上创建了外键,该约束确保favorite_food表中所输入的person_id列的值存在于person表中。下面显示了创建行时违背这一约束的结果:
INSERT INTO favorite_food (person_id, food) VALUES (999, 'zifeiy');
报错:
[Err] 1452 - Cannot add or update a child row: a foreign key constraint fails (`mydb`.`favorite_food`, CONSTRAINT `fk_fav_food_person_id` FOREIGN KEY (`person_id`) REFERENCES `person` (`person_id`))
在此情况下,由于favorite_food表的部分数据依赖于person表,因此可以将favorite_food表视为子表,而将person表视为父表,如果需要,如果需要同时将两个表输入数据,那么在向favorite_food表输入数据之前,必须现在父表中创建一行。
列值不合法
Person表中的gender列被限制为只容许'M'(男性)或'F'(女性)值,如果试图将该列设为任何其他值,都将会收到如下响应:
UPDATE person SET gender = 'Z' WHERE person_id = 1;
报错:
[Err] 1265 - Data truncated for column 'gender' at row 1
无效的日期转换
如果构建一个用于产生日期列的字符串,那么该字符串必须符合要求的格式,否则将会接受到一个错误。下面的例子中,所使用的日期格式没有与默认的日期格式“YYYY-MM-DD”像匹配:
UPDATE person SET birth_date = 'DEC-21-1999' WHERE person_id = 1;
报错:
UPDATE person SET birth_date = 'DEC-21-1999' WHERE person_id = 1;
通常情况下,显式地指定字符串格式是比依赖默认格式更好的做法。下面的语句使用str_to_date
函数指定所用字符串格式:
UPDATE person SET birth_date = STR_TO_DATE('DEC-21-2001', '%b-%d-%Y') WHERE person_id = 1;
这样做不仅使服务器感到满意,Zifeiy也会感到开心。