- A+
show create table
show create table 表名称
这也是我每次下意识想到的语句。语义好记,可以直接查看建表语句,但不便于代码处理。
information_schema.COLUMNS
select * from information_schema.COLUMNS where TABLE_SCHEMA = '库名称' and TABLE_NAME = '表名称'
相对show create table
而言,相对简单,信息全面,可以查询出来字段的名称、类型、键、权限、注释和其他信息。为了获取字段名称,故我脚本中使用这个作为获取表结构的方法。
desc
desc 表名称
简单易用,可以获取到 COLUMNS 中的比较重要的字段:名称、类型、是否为空、键、默认值、额外信息。但无法获取字段的注释。
附:information_schema.COLUMNS字段和含义
字段名称 | 含义 |
---|---|
TABLE_CATALOG | 表类型(区分不同大仓的意思) |
TABLE_SCHEMA | 所属库名称 |
TABLE_NAME | 表名称 |
COLUMN_NAME | 字段名称 |
ORDINAL_POSITION | 位置序号 |
COLUMN_DEFAULT | 默认值 |
IS_NULLABLE | 是否可为空 |
DATA_TYPE | 数据类型 |
CHARACTER_MAXIMUM_LENGTH | 字符串最大长度 (数值类型为空) |
CHARACTER_OCTET_LENGTH | 字符串最大存储长度 (一般与上一字段相同) |
NUMERIC_PRECISION | 数值精度 (非数值类型为空) |
NUMERIC_SCALE | 数值小数位数 (非数值类型为空) |
DATETIME_PRECISION | 日期精度 |
CHARACTER_SET_NAME | 编码方式 |
COLLATION_NAME | 排序方式 |
COLUMN_TYPE | 字段类型 |
COLUMN_KEY | 字段涉及的key (主键、唯一键等) |
EXTRA | 其他(如 auto_increment) |
PRIVILEGES | 权限 |
COLUMN_COMMENT | 字段注释 |
GENERATION_EXPRESSION | 代表达式(自定义) |
附:
所谓组合字段(自创的名字,没有在网上找到通用的名字),是MySQL5.7加入的新功能,可以定义一个字段,值是其他字段值的组合。
官网中举了一个勾股定理的例子:
CREATE TABLE triangle (
sidea DOUBLE,
sideb DOUBLE,
sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
);
INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);
INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);
这个例子的意思是说sidec字段的值是sidea和sideb字段值的平方和再开方,在insert该表数据的时候可以不指定sidec的值,MySQL会自己计算。
这种组合字段有两种形式,Virtual Generated Column与Stored Generated Column,可以理解为虚拟组合列和存储组合列,Virtual Generated Column的数值不会存放在磁盘上,比较省空间,就是效率不高,如果需要查询建议加索引。
默认是Virtual Generated Column,如果要设置Stored Generated Column,需要在建表语句加上STORED关键字:
CREATE TABLE triangle (
sidea DOUBLE,
sideb DOUBLE,
sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb) STORED)
);
字段设置为组合字段之后,如果数据库操作出现明显的逻辑错误,操作将被阻止,比如:
情况1:
把字段C设置为字段A除以字段B,然后试图insert一条字段A是1,字段B是0的数据,MySQL会提示错误。
情况2:
把字段C设置为字段A除以字段B,并把字段B设置为varchar类型。
建表可以成功。
insert一条字段A为1,字段B为2的数据,可以成功。
insert一条字段A为1,字段B为abc的数据,MySQL会提示错误。
以上可以看到,除非遇见MySQL实在解决不了的问题,多数数据库操作还是可以被允许的。
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-