今日内容

表的详细使用

  • 1、创建表的完成语法
  • 2.字段类型

    整型、浮点型、字符类型、日期类型、枚举与集合类型

  • 3.约束条件

    primary key、unique、not null、default

一、创建表的完成语法

1.语法
  1. create table 表名(
  2. 字段名1 类型[(宽度) 约束条件],
  3. 字段名2 类型[(宽度) 约束条件],
  4. 字段名3 类型[(宽度) 约束条件]
  5. );
  6. PS:注意事项:
  7. 1. 在同一张表中,字段名不能相同
  8. 2. 宽度和约束条件可选,字段名和类型是必须的
  9. 3. 最后一个字段后不能加逗号!
2.补充
  1. (1)宽度指的是对存储数据的限制
  2. create table userinfo(name char);
  3. insert into userinfo values('lisi');
  4. 1.没有安全模式的数据库版本,能够存放数据但是只会存进去一个j
  5. 2.最新数据库版本直接报错提示无法存储(我装的是5.7 直接出现下面的结果):
  6. mysql> insert into userinfo values('lisi');
  7. ERROR 1406 (22001): Data too long for column 'name' at row 1
  8. (2) 约束条件初识>>> null nut null
  9. create table t1(id int,name char not null);
  10. insert into t1 values(1,'j'); # 正常存储
  11. insert into t1 values(2,null); # 报错
  12. # 总结 类型与约束条件区别
  13. # 类型:限制字段必须以什么样的数据类型存储
  14. # 约束条件:约束条件是在类型之外添加一种额外的限制

二、字段类型

2.1 整型
  1. create table t1(x tinyint);
  2. insert into t1 values(128),(-129);
  3. 输出结果:
  4. mysql> insert into t1 values(-1),(-129);
  5. ERROR 1264 (22003): Out of range value for column 'x' at row 2
  6. create table t2(x tinyint unsigned);
  7. insert into t2 values(-1),(256);
  8. 输出结果:
  9. mysql> insert into t2 values(-1),(256);
  10. ERROR 1264 (22003): Out of range value for column 'x' at row 1
  11. create table t3(x int unsigned);
  12. insert into t3 values(4294967296);
  13. 输出结果:
  14. mysql> insert into t3 values (4283942745);
  15. Query OK, 1 row affected (0.07 sec)
  16. 说明:由于开启了严格模式,导致t1,t2表插入数据失败
  17. 在不开启严格模式下,可以顺利的写数据,但是:
  18. (1)tinyint:默认情况下是有符号的
  19. 有符号:-128 ~ 127
  20. 无符号:0 ~ 255
  21. (2)unsigned:表示无符号
  22. 2020.06.01更新
  23. 关于**严格模式**看这个介绍:https://www.cnblogs.com/ygcphp/p/10417260.html
  1. 2.1.2 两点补充
  2. (1)Q:类型后面的宽度能否改变字段存储的大小限制?
  3. A:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,
  4. 如果字段内采用的是整型类型,完全无需指定显示宽度,默认的是显示宽度,足够
  5. 完整的显示当初存放的数据。
  6. create table t4(x int(8));
  7. insert into t4 values(1232983640223);
  8. # 显示时,不够8位用0填充,如果超出8位则正常显示
  9. create table t5(x int(8) unsigned zerofill);
  10. insert into t5 values(1232983640223);
  11. # create table t6(id int(10) unsigned);
  12. # create table t7(id int(11));
  13. (2) 严格模式补充
  14. 在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,
  15. 发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。
  16. 但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,
  17. 让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
  18. how variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
  19. # 修改安全模式
  20. set session # 只在当前操作界面有效
  21. set global # 全局有效
  22. set global sql_mode ='STRICT_TRANS_TABLES'
  23. # 修改完之后退出当前客户端重新登陆即可
2.2 浮点型
  1. 分类:FLOAT DOUBLE decimal
  2. 应用场景:身高、体重、利率
  3. 字段限制特点: (5,3)前一位表示所有的位数,后一位表示小数个数
  4. 三者最大整数位和小数位对比: ----> 单写一个测试博客
  5. # 存储限制
  6. float(255,30) # 表示一共位数为255位,小数位为30位
  7. double(255,30) # 表示一共位数为255位,小数位为30位
  8. decimal(255,30) # 表示一共位数为65位,小数位为30位
  9. # 精确度验证
  10. create table t5(x float(255,30));
  11. create table t6(x double(255,30));
  12. create table t7(x decimal(65,30));
  13. 三者区别:
  14. 精度不同:
  15. 精度由低到高:float --> double --> decimal
  16. 代码输出结果:
  17. (1) float
  18. mysql> create table t5 (x float(255, 30));
  19. Query OK, 0 rows affected (0.54 sec)
  20. mysql> insert into t5 values(1.111111111111111111111111111111);
  21. Query OK, 1 row affected (0.08 sec)
  22. mysql> select * from t5;
  23. +----------------------------------+
  24. | x |
  25. +----------------------------------+
  26. | 1.111111164093017600000000000000 |
  27. +----------------------------------+
  28. 1 row in set (0.00 sec)
  29. (2) double
  30. mysql> create table t6 (x double(255, 30));
  31. Query OK, 0 rows affected (0.32 sec)
  32. mysql> insert into t6 values(1.111111111111111111111111111111);
  33. Query OK, 1 row affected (0.06 sec)
  34. mysql> select * from t6;
  35. +----------------------------------+
  36. | x |
  37. +----------------------------------+
  38. | 1.111111111111111200000000000000 |
  39. +----------------------------------+
  40. 1 row in set (0.00 sec)
  41. (3) decimal
  42. mysql> create table t7 (x decimal(65, 30));
  43. Query OK, 0 rows affected (0.30 sec)
  44. mysql> insert into t7 values(1.111111111111111111111111111111);
  45. Query OK, 1 row affected (0.06 sec)
  46. mysql> select * from t7;
  47. +----------------------------------+
  48. | x |
  49. +----------------------------------+
  50. | 1.111111111111111111111111111111 |
  51. +----------------------------------+
  52. 1 row in set (0.06 sec)
  1. 2.3 字符类型
  2. (1)分类:
  3. char:定长
  4. varchar:变长
  5. (2)作用:姓名、地址、描述类信息
  6. create table t8 (name char(4)); # 超过四个字符报错,不够四个字符空格补全
  7. create table t9 (name varchar(4)); # 超过四个字符报错,不够四个有几个就存几个
  8. # 验证存储限制
  9. insert into t8 values('hello');
  10. insert into t9 values('hello');
  11. # 验证存储长度
  12. insert into t8 values('a'); #'a '
  13. insert into t9 values('a'); #'a'
  14. select * from t8
  15. select * from t9 # 无法查看真正的结果
  16. select char_length(name) from t8;
  17. select char_length(name) from t9; # 仍然无法查看到真正的结果
  18. mysql> select char_length(name) from t8;
  19. +-------------------+
  20. | char_length(name) |
  21. +-------------------+
  22. | 1 |
  23. +-------------------+
  24. 1 row in set (0.37 sec)
  25. mysql> select char_length(name) from t9;
  26. +-------------------+
  27. | char_length(name) |
  28. +-------------------+
  29. | 1 |
  30. +-------------------+
  31. 1 row in set (0.00 sec)
  32. (3) char varchar 的优缺点:
  33. char:
  34. 缺点:浪费空间
  35. 优点:存取速度都快
  36. varchar:
  37. 缺点:存储速度慢
  38. 优点:节省时间
2.4 时间类型
  1. (1) 分类
  2. date: 2019-05-01
  3. time: 17:13:32
  4. datetime: 2019-05-01 17:13:32
  5. year:2019
  6. (2) 测试
  7. create table student(
  8. id int,
  9. name char(16),
  10. yy year,
  11. birth date,
  12. study_time time,
  13. reg_time datetime
  14. );
  15. insert into student values(1,'lisi','2019','2019-05-13','17:17:32','2019-05-13 17:17:32');
  16. mysql> select * from student;
  17. +------+------+------+------------+------------+---------------------+
  18. | id | name | yy | birth | study_time | reg_time |
  19. +------+------+------+------------+------------+---------------------+
  20. | 1 | lisi | 2019 | 2019-05-13 | 17:17:32 | 2019-05-13 17:17:32 |
  21. +------+------+------+------------+------------+---------------------+
  22. 1 row in set (0.00 sec)
2.5 枚举与集合类型
  1. (1)分类:
  2. 枚举enum多选一
  3. 集合set多选多(可以多选一)
  4. (2)测试:
  5. (a)枚举enum
  6. create table user(
  7. id int,
  8. name char(16),
  9. gender enum('male','female')
  10. );
  11. insert into user values(1, 'lisi','male'); # 正确
  12. # Query OK, 1 row affected (0.06 sec)
  13. insert into user values(2, 'zhangsan','xxx'); # 报错
  14. # ERROR 1265 (01000): Data truncated for column 'gender' at row 1
  15. (b)集合set
  16. create table teacher(
  17. id int,
  18. name char(16),
  19. hobby set('read','music','sleep','run')
  20. );
  21. insert into teacher values(1, 'zhangsan','music,sleep'); # 正确
  22. # Query OK, 1 row affected (0.06 sec)
  23. insert into teacher values(2, 'lisi','sleep'); # 正确 集合可以只选一个
  24. # Query OK, 1 row affected (0.06 sec)
  25. insert into teacher values(3, 'wangwu','heihei'); # 报错
  26. # ERROR 1265 (01000): Data truncated for column 'hobby' at row 1

三、约束条件

3.1 约束条件
  1. PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
  2. FOREIGN KEY (FK) 标识该字段为该表的外键
  3. NOT NULL 标识该字段不能为空
  4. UNIQUE KEY (UK) 标识该字段的值是唯一的
  5. AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
  6. DEFAULT 为该字段设置默认值
  7. UNSIGNED 无符号
  8. ZEROFILL 使用0填充
3.2 not null + default
  1. (a)not null:
  2. create table user(
  3. id int,
  4. name char(16)
  5. );
  6. insert into user values(1,null) # 可以修改
  7. # Query OK, 1 row affected (0.10 sec)
  8. alter table user modify name char(16) not null;
  9. # 报错:
  10. ERROR 1138 (22004): Invalid use of NULL value
  11. 查了一下,应该是由于表里有数据,所以不可以改
  12. mysql> delete from user;
  13. Query OK, 1 row affected (0.10 sec)
  14. mysql> alter table user modify name char(16) not NULL;
  15. Query OK, 0 rows affected (0.42 sec)
  16. Records: 0 Duplicates: 0 Warnings: 0
  17. insert into user(name,id) values(null,2); # 报错 插入数据可以在表名后面指定插入数据对应的字段
  18. # ERROR 1048 (23000): Column 'name' cannot be null
  19. (b) default:
  20. create table student(
  21. id int,
  22. name char(16) not null,
  23. gender enum('male','female','others') default 'male'
  24. );
  25. insert into student(id,name) values(1,'zhangsan') # 成功
  26. # Query OK, 1 row affected (0.09 sec)
3.3 unique
  1. (a) 单列唯一:某一项值为独一无二的
  2. create table user1(
  3. id int unique,
  4. name char(16)
  5. );
  6. insert into user1 values(1,'lisi'),(1,'wawu'); # 报错
  7. # ERROR 1062 (23000): Duplicate entry '1' for key 'id'
  8. insert into user1 values(1,'lisi'),(2,'wawu'); # 成功
  9. # Query OK, 2 rows affected (0.06 sec)
  10. # Records: 2 Duplicates: 0 Warnings: 0
  11. (b) 联合唯一:多项值,只要不全相同就ok
  12. create table server(
  13. id int,
  14. ip char(16),
  15. port int,
  16. unique (ip,port)
  17. );
  18. insert into server values(1,'127.0.0.1',8080);
  19. # Query OK, 1 row affected (0.06 sec)
  20. insert into server values(2,'127.0.0.1',8080); # 报错
  21. # ERROR 1062 (23000): Duplicate entry '127.0.0.1-8080' for key 'ip'
  22. insert into server values(1,'127.0.0.1',8081);
  23. # Query OK, 1 row affected (0.06 sec)
3.4 primary key + auto_increment
  1. (a) 单从约束角度来说 primary key <==> not null unique
  2. create table t10 (id int primary key);
  3. desc t10;
  4. +-------+---------+------+-----+---------+-------+
  5. | Field | Type | Null | Key | Default | Extra |
  6. +-------+---------+------+-----+---------+-------+
  7. | id | int(11) | NO | PRI | NULL | |
  8. +-------+---------+------+-----+---------+-------+
  9. 1 row in set (0.00 sec)
  10. insert into t10 values(1),(1); # 报错
  11. # ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
  12. insert into t10 values(1),(2);
  13. # Query OK, 2 rows affected (0.06 sec)
  14. # Records: 2 Duplicates: 0 Warnings: 0
  15. # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率
  16. (b) 强调:
  17. 1.一张表中必须有且只有一个主键,如果你没有设置主键,
  18. 那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
  19. create table t11(
  20. id int,
  21. name char(16),
  22. age int not null unique,
  23. addr char(16) not null unique
  24. )engine=innodb;
  25. desc t11;
  26. mysql> desc t11;
  27. +-------+----------+------+-----+---------+-------+
  28. | Field | Type | Null | Key | Default | Extra |
  29. +-------+----------+------+-----+---------+-------+
  30. | id | int(11) | YES | | NULL | |
  31. | name | char(16) | YES | | NULL | |
  32. | age | int(11) | NO | PRI | NULL | |
  33. | addr | char(16) | NO | UNI | NULL | |
  34. +-------+----------+------+-----+---------+-------+
  35. 4 rows in set (0.01 sec)
  36. 2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
  37. 索引:类似于书的目录,没有主键就相当于一页一页翻着查
  38. 3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
  39. (c) 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
  40. create table t12(
  41. ip char(16),
  42. port int,
  43. primary key(ip, port)
  44. );
  45. desc t12;
  46. mysql> desc t12;
  47. +-------+----------+------+-----+---------+-------+
  48. | Field | Type | Null | Key | Default | Extra |
  49. +-------+----------+------+-----+---------+-------+
  50. | ip | char(16) | NO | PRI | NULL | |
  51. | port | int(11) | NO | PRI | NULL | |
  52. +-------+----------+------+-----+---------+-------+
  53. 2 rows in set (0.01 sec)
  54. (d) 主键id作为数据的编号,每次最好能自动递增
  55. create table t13(
  56. id int primary key auto_increment,
  57. name char(16)
  58. );
  59. insert into t13 name values ('jason','jason','jason');
  60. Query OK, 3 rows affected (0.36 sec)
  61. Records: 3 Duplicates: 0 Warnings: 0
  62. # id字段自动从1开始递增
  63. # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

mysql数据库 --数据类型、约束条件的更多相关文章

  1. MySQL数据库数据类型之集合类型SET测试总结

    MySQL数据库提供针对字符串存储的一种特殊数据类型:集合类型SET,这种数据类型可以给予我们更多提高性能.降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别 ...

  2. MYSQL数据库数据类型

    07.14自我总结 MYSQL数据库数据类型 一.整数类型和浮点数典型 1.有符号/没符号 对于整数和负整数来说,默认情况下是有符号范围的 默认是有符号 有符号和没符号其实就是有没有包括负数,有符号是 ...

  3. MySql数据库数据类型及约束介绍

    1,MySql中数据类型介绍 整型及浮点型 数据类型 存储范围 字节 TINYINT 有符号值:-2^到2^7-1 无符号值:0到2^8-1 2 SMALLINT 有符号值:-2^15到2^15-1 ...

  4. MySQL数据库数据类型以及INT(M)的含义

    nt(M)我们先来拆分,int是代表整型数据那么中间的M应该是代表多少位了,后来查mysql手册也得知了我的理解是正确的,下面我来举例说明.   MySQL 数据类型中的 integer types ...

  5. mysql数据库 数据类型

    char(m) 固定长度字符串,m<=255:处理速度快: varchar(m) 可变长度字符串,m<=255: int(m) 整数型,-214783647到214783648之间,使用u ...

  6. MySQL基本数据类型与约束条件

    昨日内容回顾 数据存储的演变 # 方向: 朝着更加统一和方便管理 数据库的发展史 # 由本地保存逐步演变为线上保存 数据库的本质 # 本质上就是一款CS架构的软件 """ ...

  7. MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结

    From: http://database.51cto.com/art/201203/323863.htm 网络上很多人咨询mysql是否提供布尔类型?MySQL数据库确实提供布尔类型,此数据类型的关 ...

  8. MySQL数据库笔记二:数据类型及数据库操作

    三.MySQL数据库数据类型 MySQL数据库中支持多种数据类型:数值型.字符型.日期型 常用的数据类型: 1.整型 int:整形,存储整数 int(M):M表示预期值.与存储大小和数值的范围无关. ...

  9. MySQL数据库具体一些操作

    创建数据库:CREATE DATABASE 数据库名;删除数据库:drop database <数据库名>;选择使用(需要操作的数据库):use 数据库名称;mysql数据库数据类型:类型 ...

随机推荐

  1. 学习vim 从常用按键开始

      ctrl+e 将屏幕下滚一行 ctrl+u 将屏幕上滚半页 ctrl+d 将屏幕下滚半页 ctrl+b 将屏幕上滚一页 ctrl+f 将屏幕下滚一页 撤销 u 前进 ctrl r 移动 下一个单词 ...

  2. SQL查询条件生成小工具

    最近运维数据,经常遇到需要在sql条件中个In('',''....)个字符串的情况,于是在网上找了个小工具改造一下,先用着: 效果如图: using System; using System.Coll ...

  3. ubuntu18.4 搭建lamp环境

    一.Apache2 web服务器的安装: 可以先更新一下服务器(可选) 1.sudo apt update             # 获取最新资源包 2.sudo apt upgrade       ...

  4. 每天一个Linux常用命令 cp命令

    Linux cp命令主要用于复制文件或目录 -a:此选项通常在复制目录时使用,它保留链接.文件属性,并复制目录下的所有内容.其作用等于dpR参数组合. -d:复制时保留链接.这里所说的链接相当于Win ...

  5. Begin at this time

    学习了一段时间的Python,今天终于下定决心建立博客来记录自己的机器学习之路了.希望这是一个好的开始,希望自己永远不放弃,坚持努力下去.

  6. STL_Algorithm

    #include <algorithm> #include <cstdio> using namespace std; /*虽然最后一个排列没有下一个排列,用next_perm ...

  7. transform:translate(-50%,-50%)

    和父亲元素没关系,走自己盒子宽度一半

  8. vue 父子组件数据双向绑定

    父组件 <find-search v-model="searchshow"></find-search> 子组件 props: { value: { typ ...

  9. PHP面向对象简易验证码类

    PHP简易验证码类 <?php class authCode { private static $instance = null; #实例对象 private $width = 120; #图片 ...

  10. 【JavaWeb项目】一个众筹网站的开发(四)后台用户注册功能

    重点: 密码加密存储 使用jQuery插件做校验和错误提示等 密码不能明文存储,在数据库中是加密存储的 可逆加密:通过密文使用解密算法得到明文 DES AES 不可逆加密:通过密文,得不到明文 MD5 ...