以MySQL的sakila数据库中的city表为例,探讨建表语句:
CREATE TABLE `city` (
`city_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`city` varchar(50) NOT NULL,
`country_id` smallint(5) unsigned NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`city_id`),
KEY `idx_fk_country_id` (`country_id`),
CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Note:
1.unsigned 整数类型有可选的UNSIGNED属性,表示不允许负值,大致可以使得正数的上限提高一倍。
2.ON UPDATE CURRENT_TIMESTAMP 当执行UPDATE操作时,并且字段有ON UPDATE CURRENT_TIMESTAMP属性。
则字段无论值有没有变化,它的值也会跟着更新为当前UPDATE操作时的时间。
3.KEY `idx_fk_country_id` (`country_id`) 说明在建表时country_id使用了UNIQUE修饰
4.ON UPDATE CASCADE在更新父表时,级联更新子表。
ON DELETE RESTRICT立即检查外键约束,如果子表中有匹配的记录,则不允许删除父表中的对应键。
5.ENGINE=InnoDB设置存储引擎
6.AUTO_INCREMENT=601此时的自增键值为601
7.DEFAULT CHARSET=utf8mb4指定编码集
8.COLLATE=utf8mb4_0900_ai_ci指定排序规则,对于字符类型的列都需要一个COLLATE类型来告诉MySQL如何排序和比较。
所以会影响ORDER BY的结果,也会影响WHERE中>或者<筛选的结果。
题外话内容:
COLLATE通常是和数据编码(CHARSET)相关,utf8mb4编码的默认值为utf8mb4_general_ci。
mysql中有utf8和utf8mb4两种编码,在mysql中请大家忘记utf8,永远使用utf8mb4。
这是mysql的一个遗留问题,mysql中的utf8最多只能支持3bytes长度的字符编码,对于一些需要占据4bytes的文字,
mysql的utf8就不支持了,要使用utf8mb4才行。
很多COLLATE都带有_ci字样,这是Case Insensitive的缩写,即大小写无关,也就是说"A"和"a"在排序和比较的时候是一视同仁的。
select * from table1 where field1="a"同样可以把field1为"A"的值选出来。
与此同时,对于那些_cs后缀的COLLATE,则是Case Sensitive,即大小写敏感的。
在mysql中使用show collation指令可以查看到mysql所支持的所有COLLATE,可以使用WHERE过滤。