参考资料:MySQL 5.7 官方文档
1. 约束 Cosntraints
- NOT NULL: 非空约束
- UNIQUE: 唯一约束,指定列和组合列的数据不重复
[unique约束查值时速度快,但是插入时需要锁住,防止重复插入?]:
- PRIMARY KEY: 主键约束,指定列的数据唯一且非空
每张表最多只允许一个主键,建立主键可以在列级别也可以在表级别。 - FOREIGN KEY: 外键
- CHECK: 检查,指定一个表达式,用于检验指定数据,但是mysql不起作用
2. 索引 KEY
3. mysql在表的列数及行数上的限制
Limits on Table Column Count and Row Size
- 列数限制: 即一个表最多有多少COLUMNS
- 行的限制:指的是该表存储一行数据所占的存储空间大小(个人理解,也就是 row buffer的大小)。其中TEXT和BLOB的存储位置不在行缓冲(row buffer),它们仅占用9到12bytes的大小。也就是说表的所有列的大小(刨除TEXT和BLOB)不能超过该限制。
MySQL对于表的COLUMN有数量限制:4096个。ROW的限制是:65,535 bytes。但是根据不同的存储引擎和字符集设置等,该限制也会有变化。
/*行数超过限制*/
mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs
/*将其中的一列数据类型改为TEXT*/
mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)
4. 数据类型
MySQL 支持SQL的数据类型有:数字、日期及时间、字符及字符串等
类型 | 大小 |
---|---|
BIT | 1 比特 |
TINYINT | 1 字节 |
SMALLINT | 2 字节 |
INT | 4 字节 |
BIGINT | 8 字节 |
FLOAT | 4 字节 |
DOUBLE | 8 字节 |
FLOAT: 单精度浮点型,精度大概小数点后7位,是约数(Floating-Point Types (Approximate Value)), 浮点型用于比较时可能会得到不期望的结果(Problems with Floating-Point Values)。
DOUBLE: 双精度浮点型,精度为小数点后15位,是约数
DECIMAL: 固定浮点, 是准确数 (Fixed-Point Types (Exact Value) )
DECIMAL(M,D): M默认为30,最大为65;D默认为0,最大为30.
5. 字符类型
- CHAR(M):定长字符串,存储时不足M个字符,以空字符补全。CHAR 在查询是会去掉字符串尾部的空白字符。
- VARCHAR(M):可变长字符串。VARCHAR 相比于CHAR存储时需要1字节或2个字节的前缀(The CHAR and VARCHAR Types), 如果所存字符大小大于255个字节则需要2个字节,否则1个字节。
M是指该列的字符数量,它受限于编码方式和MySQL在表的列数及行数上的限制。字符数量,不是字节数量。如果设置数据库编码方式为UTF-8, 一个字符需要三个字节表示。M=4,存了4个UTF-8字符后,则占用12+1个字节的ROW SIZE。
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab ) | (ab) |
+---------------------+---------------------+
1 row in set (0.06 sec)