mysq基几种本数据类型的特点(●ˇ?ˇ●)
一、整数
- 表数范围: 从 2的(n-1)次方 到 2的(n-1)次方 再减 1
- 不要指定宽度
- TINYINT ?8位 ?(-128 - 127)
- SMALLINT 16位 ?(-32768 - 32767)
- MEDIUMINT ?24位 (-8388608 - 8388607)
- INT 32位 ?大约正负21亿(可以为整数指定宽度,如INT(11),但对大多数应用是没有意义的,它不会限制值的合法表数范围,只是规定了mysql客户端在显示是的字符个数)
- BIGINT 64位?
- 👆:都可选择 UNSIGNED修饰(用UNSIGNED修饰,表示无符号型整数,不允许出现负值,大致可以使正数的上限提高一倍 )
二、实数(带有小数点)
? ?👆FLOAT、DOUBLE使用标准的浮点运算进行近似计算,不要指定精度
? ?👆DECIMAL示例:decimal(5,2),说明:5位长度,2位小数精度,如果整数部分+2位小数超长,则报错,如果只是小数部分超出2两位,则四舍五入到两位小数
???👆DECIMAL精确计算:尽量在需要精确计算时使用decimal类型,例如:财务数据。 在数据量很大时可以可以考虑使用bigint来代替decimal类型,将需要存储的货币单位根据小数的位数乘以一个倍数,转换为整数保存
?三、字符串
- 定长,msql根据定义字符串的长度一次分配足够的空间
- 适用场景:较短的字符串,且所有值接近同一长度
- 比定长类型节约空间
- 但是ROW_FOMAT=FIXED每行使用定长
- 适用场景:字符串的最大长度比评估长度大很多,列的更新较少
- 缺点:频繁修改,且字符串的长度变化大时,可能出现页分裂
- 不要盲目的给过大的长度(过长的列会消耗更多的内存,mysql通常会分配固定大小的值来保存内部值,尤其是使用内存临时表进行排序或操作时性能会比较糟糕,在利用磁盘临时表进行排序时也同样糟糕。最好的策略是只分配必要的空间)
- 在临时表或排序时可能遭遇最大长度分配内存问题
四、TEXT、BLOB
- TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT、LONGTEXT
- TINYBLOB
- SMALLBLOB
- BLOB
- MEDIUMBLOB
- LONGBLOB
- 都为存放很大的数据而设计
- 与其他数据不同,都作为独立的对象存储
- 当值太大时,使用外部存储区存储,每行只要使用1-4字节存放一个指针
五、日期时间
- 精度:秒
- 与时区无关,8个字节存储空间
- 范围:1001 至 9999 年
- 保存1970年1月1日午夜以来的秒数(与UNIX时间戳相同)
- 范围:1970年 至 2038年
- 与时区有关
- 默认为NOT NULL
- 通常尽量使用timestamp
- 精度:秒
- yyyy-MM-dd
- time
- HH:mm:ss
六、选择标识符
- 用来进行关联操作
- 在其他表中作为外键
- 整型通常是标识列的最好选择
- 相关的表中使用相同的数据类型
- 尽量避免字符串作为标识列,尤其是随机生成的字符串,(如:uuid)导致insert与select都很慢 (*Φ皿Φ*)👇
- 插入值被随机写到索引的不同位置,insert慢,容易导致页分裂,磁盘随机读取
- 逻辑上相邻的行被分布在磁盘和内存的不同地方,select慢
- 使mysql查询缓存失效
- 如果需要存储uuid,则应将“-”去除
一、建表
CREATE TABLE 表名称(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
unique(列名称1[,列名称2,...,列名称N])
)
create table t_student
(
sid int not null comment '学号',
sname varchar(60) not null comment '姓名',
sex tinyint not null default 1 comment '性别:1男, 2女',
age tinyint not null comment ' 年龄',
icard varchar(18) not null comment '身份证,唯一约束',
primary key (sid),
unique key AK_Key_2 (icard)
) comment '学生信息表';
ALTER TABLE 表名 ADD PRIMARY KEY(主键名称)
二、约束
? 增加主键
alter table table_test add primary key(id);
--注:在增加主键之前,必须先把反复的id删除掉
??删除主键
ALTER TABLE 表名 DROP PRIMARY KEY
?sid?INT NOT NULL COMMENT '学号',
DROP TABLE IF EXISTS t_score;
CREATE TABLE t_score
(
id INT NOT NULL COMMENT '记录流水号',
sid INT NOT NULL COMMENT '学号',
cid INT NOT NULL COMMENT '课程ID',
score FLOAT COMMENT '成绩',
PRIMARY KEY (id),
FOREIGN KEY (sid) REFERENCES t_student (sid) ON DELETE RESTRICT ON UPDATE RESTRICT,
UNIQUE KEY AK_Key_2 (sid, cid)
);
说明: sid为本表的外键,关联t_student表中的的sid主键,ON DELETE RESTRICT ON UPDATE RESTRICT说明在本表有数据的情况下,主表的关联键不能删除或更新。
? ?增加外键
ALTER TABLE 表名 ADD FOREIGN KEY(外键名称) REFERENCES 主表名称(主键名称)
? ??删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 约束名
- 唯一约束??UNIQUE KEY 约束名 (字段)
? 创建唯一约束
ALTER TABLE 表名 ADD UNIQUE(列名称1[,列名称2,..])
create unique index UserNameIndex on 't_user' ('username')
? 删除唯一约束
ALTER TABLE 表名 DROP INDEX 唯一约束缩影名称