MySql5.6表操作
-
数据类型
整型
浮点型
字符类型
日期类型
枚举类型与集合类型
-
约束条件
Primary key
Unique key
Not null
Foreign key
创建表的完整语法
Create table 表明(字段名1 类型【(宽度) 约束条件】)
注意事项:
-
在同一张表中,字段的名字不能相同
-
宽度和约束条件可以选,字段名和类型是必须的
-
当输入多个字段的时候最后一个字段末尾不能加逗号
宽度:
-
宽度是对村塾数据的限制
创建一个表测试下:
mysql> create database db1;
mysql> use db1;
mysql> create table userinfo(name char);
mysql> insert into userinfo values('jason');
ERROR 1406 (22001): Data too long for column 'name' at row 1
在没有安全模式的数据库版本,默认能够存放数据,但是只会存进去一个j
-
约束条件 null 与not null
创建一个表测试下
mysql> create table t1(id int,name char not null);
mysql> insert into t1 values(1,'j');
mysql> insert into t1 values(2,null);
ERROR 1048 (23000): Column 'name' cannot be null
提示内容不能为空
#总结 类型与约束条件的区别
# 类型:限制字段必须以什么样的数据类型存储
#约束条件:约束条件是在指定的类型之外添加的一种额外限制
基本数据类型
整型:
分类:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:存储年龄、等级、id、各种号码等
验证:
验证整型字段有误符号及范围;
Signed——有符号
Unsigned——无符号
mysql> create table t2(x tinyint);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t2 values(-128);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t2 values(-129);
ERROR 1264 (22003): Out of range value for column 'x' at row 1
mysql> insert into t2 values(256);
ERROR 1264 (22003): Out of range value for column 'x' at row 1
只能插入指定范围内的数值
mysql> create table t3(x tinyint unsigned);
Query OK, 0 rows affected (0.00 sec)
类型后面的宽度是否能够改变字段存储的大小限制
mysql> create table t5(x int(8));
Query OK, 0 rows affected (2.43 sec)
mysql> insert into t5 values(111111111);
mysql> insert into t5 values(12345);
mysql> select * from t5;
+-----------+
| x |
+-----------+
| 111111111 |
| 12345 |
+-----------+
这里可以看到设置范围为8位,插入数据的时候插入9位完整显示,不足8位数值前面用0自动补全。
对于正想来说,数据类型后的快递并不是存储限制,而是显示限制,所以在创建表时,如果字段采用的是整型类型,完全不虚指定显示宽度,默认的显示宽度,足够显示完整当初存放的数据。
严格模式:
上面当数据超过最大存储长度,发现数据也能正常存储进去,只是mysql帮我们截取了最大长度,在实际情况下为了缓解数据库压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式。
查看数据库配置中变量名包含mode的配置参数
修改安全模式
Set session #在当前操作界面有效
Set global #全局有效
Set global sql_mode =' STRICT_TRANS_TABLES'
修改完成后退出当前客户端重新登录即可
浮点型:
分类:float double decimal
应用场景:身高、体重、薪资
字段显示特点(5,3)前一位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);
可以看到不同的字段限制类型精准度不同
字符类型:
分类:char(定长) varchar(边长)
作用:姓名、地址、描述类信息
mysql> create table t15(name char(4));
mysql> create table t16(name varchar(4));
超过四个字符就报错
mysql> insert into t15 values('hello');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into t16 values('hello');
ERROR 1406 (22001): Data too long for column 'name' at row 1
在范围内可以正常保存,
mysql> insert into t15 values('he');
mysql> insert into t15 values('he');
通过查看结果看不出效果:
mysql> select * from t15;
+------+
| name |
+------+
| he |
+------+
mysql> select * from t16;
+------+
| name |
+------+
| he |
+------+
通过char_length来查看长度
这里还是看不出效果
修改mysql的mode模式,
mysql> set global sql_mode='STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
退出客户端重新登录
针对char类型,mysql在存储时会将数据用空格补全全部放入到硬盘中,但是会在读出结果的时候自动取掉末尾的空格
Char 和varchar的使用区别
Char:
优点:存取速度快
缺点:浪费空间
Varchar:
优点:节省空间
缺点:存取速度慢
时间类型
分类:
data:2019-05-13
time:11:11:11
Datetime:2019-01-02 11:11:11
Year:2019
测试:
mysql> create table student( id int, name char(16), test_year year, test_date date, test_time time, test_datetime datetime );
mysql> insert into student values(1,'egon','2019','2019-05-13','16:42:11','2019-05-13 16:42:11');
枚举与集合
分类:
枚举enum多选一
集合set多选多
测试
在gender字段中使用枚举多选一,只能选择规定中的内容
mysql> create table user( id int, name char(16), gender enum('male','female','other') );
插入数据报错,
mysql> insert into user values(1,'jason','xxx');
提示gender类型值错误
mysql> create table teacher(id int,name char(16),gender enum('male','female','others'),hobby set('read','sleep','sanna','obj'));
mysql> insert into teacher values(1,'egon','male','read,sleep');
结束条件:
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREING KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(证书类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
not null+default
不为空设置默认值
mysql> create table user2 id int, name char(16));
mysql> insert into user2values(1,'null');
mysql> alter table user2modify name char(16) not null:
删除表中数据,转换name字段类型设置为非空类型
name字段不以插入空值,报错
mysql> create table student( id int, name char(16) not null, gender enum('male','female','other') default 'male' );
Unique:标识该字段的值是唯一的
单列唯一
mysql> create table user3( id int unique, name char(16) );
插入数据失败,其中id值重复
插入数据成功,id值不能相同,确保唯一
联合唯一:多个值唯一
mysql> create table user4( id int, ip char(16), port int, unique(ip,port) );
其中ip和port为联合唯一值
插入相同的ip和port报错
插入相同ip不同port插入成功
插入不同ip相同port成功
Primary key+auth_increment
# 但从约束角度来说primary key就等价于not null unique
mysql> create table t20(id int primary key);
插入相同数据报错
插入不同数据正常
#除了约束之外,还是innodb引擎组织数据的依据,提升查询效率
强调:
一张表中必须有且只有一个逐渐,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
mysql> create table t21(id int,name char(16),age int not null unique,addr char(16) not null unique)engine=innodb;
2、表中没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着在你查询的时候无法根据这个主键字段加速查询
索引:类似于书目录,没有主键就需要一页一页翻着查找(相当于全文查找)
-
一张表中通常都应该有一个id字段,并且通常将id'字段作为主键
#联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
mysql> create table t22(ip char(16),port int,primary key(ip,port));
# 主键id作为数据的编号,每次最好能自动递增
mysql> create table t23( id int primary key auto_increment, name char(16) );
插入数据,插入name数据,id自动生成
mysql> insert into t23(name) values('egon1'),('egon2'),('egon3');
删除其中一条数据,在插入一条数据删除的那个数据的id号不会再使用
插入新的数据查看效果
清空整个表插入数据还是这个各子,如果想手动插入可以指定id号
清空整张表从零开始使用truncate 表明
作用:将整张表重置,id重新从0开始记录