一、字段类型
创建表的完整语法:
create table 表名(
字段名 字段类型[(宽度) 约束条件],
…………
字段名 字段类型[(宽度) 约束条件]
)
# 栗子
create database testnow;
use testnow;
create table info(name char);
insert into info values('moon');
**P.S.**:在非严格模式下,栗子中的能够插入成功,但是只能显示一位,在严格模式下则会报错。
字段类型:约束该字段存储的数据类型
宽度:对数据存储的限制
约束条件:基于字段类型附加的额外限制条件,如不能为空 not null,不能重复
注意点:
- 同一张表内,字段名不能重复
- 字段名和字段类型是必须的,宽度和约束条件是可选的
- 最后一个字段后不能加逗号!
(一)、整型
分类
TINYINT(1),SMALLINT(2),MEDIUMINT(3),INT(4),BIGINT(8)
特殊的宽度
默认有正负号,唯独整型字段在设置宽度的时候,限制不是存储宽度而是显示宽度,在创建整型字段的时候,不需要指定字段宽度(整型的显示宽度),如果存入的数字不够整型的最大限制位数默认用空格填充
(二)、浮点型
分类
float,double,decimal
float(m,n) # 总长度为m位,其中小数占n位
精度:
由低到高float,double,decimal
(三)、字符类型
char:定长 不超过宽度前提下不够用空格填充
varchar:变长 不超过宽度前提下按实际长度存储 自动加上报头来标识数据长度
(四)、日期类型
-
date 年月日
-
time 时分秒
-
datetime 年月日时分秒
-
year 年
栗子 create table time( id int, birth date, class_time time, reg_time datetime, yy year ); insert into time values(1,"1994-03-30","18:18:18","2018-08-18 18:18:18","2018");
(五)、枚举和集合
枚举(enum):多选一
栗子
create table info(
id int,
name char(16),
gender enum('male','female','other'
);
gender插入的值只能是'male','female','other'三者之一
集合(set):多选多,也可以只选一个
栗子
create table set(
id int,
name char(6),
gender enum('male','female','others'),
hobby set('read','code','game','run')
);
insert into t17 values(1,'tank','male',"read,game,run");
二、约束条件
PRIMARY KEY (PK)
标识该字段为该表的主键,可以唯一的标识记录,一般配合AUTO_INCREMENT实现自增
单从约束角度来说primary key就等价于not null + unique,除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率;
注意:
- 一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
- 如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询,索引就类似于书的目录,没有主键就相当于一页一页翻着查
- 一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
- 联合主键:多个列联合作为主键
FOREIGN KEY (FK)
标识该字段为该表的外键
NOT NULL
标识该字段不能为空
UNIQUE KEY (UK)
标识该字段的值是唯一的
单列唯一:该列只能有唯一的一行,例如ID
# 栗子
create table user(
id int unique,
name char(16)
);
insert into user values(1,'moon'),(1,'zier') # 报错
insert into user values(1,'moon'),(2,'zier') # 成功
联合唯一:两列联合起来是唯一的,IP和PORT
# 栗子
create table server(
id int,
ip char(16),
port int,
unique(ip,port)
);
insert into server values(1,'127.0.0.1',8080);
insert into server values(2,'127.0.0.1',8080); # 报错
insert into server values(1,'127.0.0.1',8081);
AUTO_INCREMENT
标识该字段的值自动增长(整数类型,而且为主键),结合主键使用
DEFAULT
该字段设置默认值
UNSIGNED
无符号
ZEROFILL
使用0填充
三、拾遗
show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
修改安全模式:必须将你想要所有模式都写入,不是添加模式而是更新模式
set session # 只在当前操作界面有效
set global # 全局有效
set global sql_mode ='STRICT_TRANS_TABLES'; # 严格模式
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; # 不自动清除末尾空格
delete from 表名; # 删除所有信息,但不会重置id(主键)
truncate 表名; # 重置整张表,包括id