CREATE TABLE标准

以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过滤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值