表操作
1.数据类型
建表的时候,字段都有对应的数据类型
整型
浮点型
字符类型(char与varchar)
日期类型
枚举与集合
2.约束条件
primary key
unique key
not null
foreign key
详细内容
创建表的完整语法
1. 在同一张表中,字段名不能重复
2. 字段和类型是必须的,宽度和约束条件可选
3. 最后一个字段后不能加逗号!
#语法:create table表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]);
# 补充:
#1.宽度指的是对存储数据的限制create table userinfo(name char);insert into userinfo values('json');
"""1.没有安全模式的数据库版本,能够存放数据但是只会存进去一个j2.最新数据库版本直接报错提示无法存储:Data too long for column 'name' at row 1"""
#2.约束条件初识>>> null 与 not null
create table t1(id int,name char not null);insert into t1 values(1,'j'); # 正常存储insert into t1 values(2,null); # 报错
# 字段类型与约束条件的关系:
# 字段类型:限制数据的存储类型
# 约束条件:基于字在类型附加的额外限制
基本数据类型
整型
分类:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:存储年龄,等级,id,各种号码等
1)验证整型字段有无符号及范围
create table t1(x tinyint);insert into t1 values(128),(-129);create table t2(x tinyintunsigned);insert into t2 values(-1),(256);create table t3(x intunsigned);insert into t3 values(4294967296);
2)疑问:类型后面的宽度能否改变字段存储的大小限制
create table t4(x int(8));insert into t4 values(4294967296123);
# 显示时,不够8位用0填充,如果超出8位则正常显示create table t5(x int(8) unsigned zerofill);insert into t5 values(4294967296123);
#create table t6(id int(10) unsigned);
#create table t7(id int(11));
3)给整型设置宽度:
特例:唯独整型字段在设置宽度的时候,限制不是存储宽度而是显示宽度
在创建整型字段的时候,不需要指定字段宽度(整型的显示宽度)
严格模式补充
存储数据时超过它们的最大存储长度,也能正常存储进去,原因:mysql自动截取了最大长度。
在实际情况下应尽量减少数据库的操作,缓解数据库的压力,让它仅管理数据即可,这时需要设置安全模式(设置严格模式)
set global sql_mode ='STRICT_TRANS_TABLES'
mode:like模糊查询
%:匹配任意数量的任意字符
_:匹配单个数量的任意字符
show variables like "%mode%";
show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
# 设置严格模式setsession # 只在当前操作界面有效setglobal # 全局有效set global sql_mode ='STRICT_TRANS_TABLES' # 默认:NO_ENGINE_SUBSTITUTION# 设置完成之后退出当前客户端重新登陆即可
浮点型
分类:FLOAT DOUBLE decimal
应用场景:身高,体重,薪资
字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数
# 存储限制float(255,30)double(255,30)decimal(255,30)
# 精确度验证(由低到高)create table t9(x float(255,30));create table t10(x double(255,30));create table t11(x decimal(65,30));insert into t9 values(1.111111111111111111111111111111);insert into t10 values(1.111111111111111111111111111111);insert into t11 values(1.111111111111111111111111111111);
# 精度结果:1字节、2字节、全显
字符类型
分类:char(定长)、varchar(变长)
作用:姓名,地址,描述类信息
char读出时不自动去除空格:set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
create table t12(name char(4)); # 超出四个字符报错,不够四个字符空格补全create table t13(name varchar(4)); # 超出四个字符报错,不够四个有几个就存几个
# 验证存储限制insert into t12 values('hello');insert into t13 values('hello');
# 验证存储长度insert into t12 values('a'); #'a'
insert into t13 values('a'); #'a'
select * fromt12;select * fromt13; # 无法查看真正的结果select char_length(name) fromt12;select char_length(name) fromt13; # 仍然无法查看到真正的结果
"""首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
# 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
# 退出客户端重新登陆select char_length(x) from t12; #4
select char_length(y) from t13; #1# 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格
"""
char与varchar的使用区别
"""
namechar(5)
# 缺点:浪费空间
# 优点:存取速度都快
tom bob lxx jxx txx
namevarchar(5)
# 缺点:存取速度慢
# 优点:节省空间
1bytes+tom 1bytes+bob 1bytes+lxx 1bytes+jxx 1bytes+txx
时间类型
分类:date:2019-05-01
time:11:11:11
Datetime: 2019-01-02 11:11:11
Year:2019
create tablestudent(
idint,
namechar(16),
born_yearyear,
birth date,
study_time time,
reg_timedatetime);insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');
枚举与集合类型
分类:枚举enum多选一 集合set多选多
create table user(
idint,
namechar(16),
gender enum('male','female','others')
);insert into user values(1,'jason','xxx') # 报错insert into user values(2,'egon','female') # 正确!create tableteacher(
idint,
namechar(16),
gender enum('male','female','others'),
hobbyset('read','sleep','sanna','dbj')
);insert into teacher values(1,'egon','male','read,sleep,dbj') # 集合也可以只存一个
约束条件
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
not null+default
create table user(
idint,
namechar(16)
);insert into user values(1,null) # 可以修改alter table user modify name char(16) not null;insert into user(name,id) values(null,2); # 报错 插入数据可以在表名后面指定插入数据对应的字段create tablestudent(
idint,
namechar(16) not null,
gender enum('male','female','others') default 'male')insert into student(id,name) values(1,'jason') # 成功
unique
# 单列唯一create tableuser1(
idint unique,
namechar(16)
);insert into user1 values(1,'jason'),(1,'egon') # 报错insert into user1 values(1,'jason'),(2,'egon') # 成功
# 联合唯一create tableserver(
idint,
ipchar(16),
portint,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);
primary key+auto_increment
单从约束角度来说primary key就等价于not null unique
除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率
create table t11(id int primary key);desct11;insert into t11 values(1),(1); # 报错insert into t11 values(1),(2);
强调:
1.一张表中必须有且只有一个主键,如果没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
索引:类似于书的目录,没有主键就相当于一页一页翻着查
3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
create tablet12(
idint,
namechar(16),
ageint not null unique,
addrchar(16) not null unique)engine=innodb;desct12;
# 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键create tablet18(
ipchar(16),
portint,primary key(ip,port)
);desct18;
# 主键id作为数据的编号,每次最好能自动递增create tablet13(
idint primary keyauto_increment,
namechar(16)
);insert into t13('jason'),('jason'),('jason'); # id字段自动从1开始递增
# 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
补充
# delete确实可以将表里的所有记录都删掉,但不会将id重置为0:delete fromtb1;
# 所以delete 根本不是用来清空表的,它是用来删除表中某一些符合条件的记录delete from tb1 where id > 10;
如果要清空表,使用truncate tb1;
作用:将整张表重置,id重新从0开始记录