创建表的完整语法
# 语法
create table 表名 (
字段名1 类型(宽度) 约束条件,
字段名2 类型(宽度) 约束条件,
字段名3 类型(宽度) 约束条件
)
# 注意
1. 在同一张表中字段名不能重复
2. 宽度和字段约束条件可写可不写,但字段类型是必须的,约束条件可以写多个
3. 最后一行不能有逗号
# 宽度
一般情况下指的是对存储数据的限制
create table t1(name char); # 默认宽度为1
insert into t1 value("aoteman"); # 报错
insert into t1 value(Null); # 关键词 null
针对不同版本会出现不同的结果
5.6 版本默认没有开启严格模式,规定只能存一个字符串你给了多个字符串,不会报错,而是自动截取并存入。
5.7 及以上版本默认开启严格模式,超过规定的字符串长度,就会报错
# 约束条件 Null not null 该字段不能为空
create table t1(
id int not null,
name char(8) not null
);
# 宽度和约束条件
宽度是用来限制数据的存储
约束条件是在宽度的基础上增加的额外的约束
整型字段
分类
- tinyint
- samllint
- meduimint
- bigint
作用
存储年龄、等级、id、号码等
是否有符号
默认情况下是带符号的(即有政府)
超出会如何
非严格模式下超出限制只存储最大可接受值,严格模式下报错
create table t1(id tinyint);
insert into t9 values(-129),(256); # 严格模式下报错
# 约束条件 unsigned 无正负符号
create table t1(id tinyint unsigned);
# 整型默认情况下都是带正负号的
# 针对整型括号内 宽度 的作用
create table t1(id int(8));
insert into t1 values(123456789); # 不报错
# 只有在 整型括号内的宽度的数字限制的不是表示位数而是长度
create table t1(id int(8));
如果数字没有出超出 8 位,用 空格 填充至 8 位
如果超出了 8 位,有几位就存几位(但是还是遵循最大范围)
严格模式
# 查看严格模式
show variables like "%mode";
# 模糊匹配/查询
关键词 like
匹配任意多个字符 %
匹配任意单个字符 _
# 修改严格模式
set session; # 只在当前窗口有效
set global; # 全局有效
set global sql_mode = 'STRICT_TRANS_TABLES';
# 修改完,重启服务端就行
浮点类型
分类
- float
- double
- decimal
作用
身高、体重、薪资
# 存储限制
float(255,30) # 总共 255 位,小数占 35 位
double(255, 30)
decimal(65, 30)
# 精确度不同
create table t1(
id float(255, 30),
id2 double(255, 30),
id3 decimal(65, 30)
);
insert into t1 values
(1.111111111111111111111111111111,
1.111111111111111111111111111111,
1.111111111111111111111111111111);
select * from t1\G;
*************************** 1. row ***************************
id: 1.111111164093017600000000000000
id2: 1.111111111111111200000000000000
id3: 1.111111111111111111111111111111
# 精度 float < double < decimal
# 结合实际场景,三者都可以使用
时间类型
分类
- date: 年月日
- datetime: 年月日时分秒
- time: 时分秒
- year: 年份
create table student(
id int,
name varchar(16),
born year,
birth date,
study_time time,
reg_time datetime
);
枚举和集合类型
分类
枚举(enum) 多选一
集合(set) 多选多
使用
create table user(
id int,
name char(16),
gender enum("male", "famale", "other")
);
insert into user values(1, "aoteman", "other");
# 枚举字段 在存数据的时候只能从枚举里面选择一个存储
create table teacher(
id int,
name char(16),
gender enum("male", "female", "other"),
hobby set("read", "run", "play")
);
insert into teacher values(1, "aoteman", "other", "reaad,run,play");
# 集合可以只写一个,不能写没有列举
部分约束条件
default 默认值
# 补充:插入数据的时候可以指定字段
create table t1(
id int,
name char(16),
gender enum("male", "female", "other") default "male"
);
insert into t1(id, name) values(1, "aoteman");
selelct * from t1;
+------+---------+--------+
| id | name | gender |
+------+---------+--------+
| 1 | aoteman | male |
+------+---------+--------+
unique 唯一
# 单列唯一
create table t1(
id int unique,
name varchar(16)
);
insert into table (id, name) values(1, "aoteman"), (1, "alterman"); # 报错
insert into table (id, name) values(1, "aoteman"), (2, "alterman");
# 联合唯一
举例:ip 和 port,单个可以重复,但加在一起是唯一的
create table t1(
id int,
ip char(16),
post int,
unique (ip, post)
);
insert into t4 values(1, "127.0.0.1", 8080);
insert into t4 values(2, "127.0.0.1", 8081);
insert into t4 values(3, "127.0.0.1", 8082);
insert into t4 values(4, "127.0.0.1", 8080); # 报错
primary key
# 单从约束效果上来看,primary key 相当于 not null + unique(非空且唯一)
create table t1(
id int primary key
);
insert into t1 values(null); # 报错
insert into t1 values(1), (1); # 报错
insert into t1 values(1), (2);
# 除了有约束条件外,它还是 innodb 存储引擎组织数据的依据,即 innodb 存储引擎在创建表时必须要有 primary key -- 类似于书的目录,能够帮助提升查询效率并且也是建表的依据
# 1. 一张表中有且只有一个主键 如果没有设置主键那么会从上往下搜索直到遇到一个非空且唯一的字段将它自动升级成主键
create table t1(
id int,
name char(16),
age int not null unique,
addr char(32) not null unique
);
describe t1;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(16) | YES | | NULL | |
| age | int(11) | NO | PRI | NULL | |
| addr | char(32) | NO | UNI | NULL | |
+-------+----------+------+-----+---------+-------+
这时候 主键 是 age
# 2. 如果表中没有主键也没有任何的非空且唯一的字段,那么 innodb 会采用自己内部提供的一个隐藏字段作为主键,隐藏意味着无法使用到它,也无法提升查询速度
# 联合字段主键(多个字段联合起来作为主键 本质还是一个主键)
create table t1(
id int,
ip varchar(16),
port int,
primary key(ip, port)
);
# 以后创建表的时候一定要加 primary key