python开发mysql:mysql数据类型&约束条件
一 整形
- 只有Int类型跟存储没有关系,显示的是宽度,其他类型都是限制
- 整形类型;[(m)][unsigned][zerofill]
- 作用;存储年龄,等级,id,各种号码
- m,代表显示宽度 默认11 其他数据类型标识的就是几个字节,限制几个字节
- unsigned,代表 限制没有字符
- zerofill,代表 宽度显示不够,用0补全
- 1 整数数字 默认有符号
- tinyint(1个字节),int(4个字节),bigint(8个字节):注意一下,约束条件和范围
- 常用 int,bigint 其中int最为常用
- 因为有符号的原因,占用了一个bit位,所以在范围上,有无符号有差别的
- 1.1 tinyint(1个字节) 2**8
- create table t1(id tinyint);
- alter table t1 modify id tinyint unsigned; 改成无符号,如果有数据 先要清空
- 小整数,数据类型用于保存一些范围的整数数值范围
- 有符号,-128 到 127
- 无符号,0 到 255
- 1.2 int(4个字节) 2**32
- create table t1(id int);
- 整数,数据类型用于保存一些范围的整数数值范围:
- 有符号,-2147483648 ~ 2147483647
- 无符号,0 ~ 4294967295
- 1.3 bigint(8个字节) 2**64
- create table t1(id bigint);
- 大整数,数据类型用于保存一些范围的整数数值范围:
- 有符号,-9223372036854775808 ~ 9223372036854775807
- 无符号,0 ~ 18446744073709551615
- 1.2 宽度 不指定宽度,默认会有int 11,默认合理合法,11位包含了2**32有无符号都包括了
- alter table t1 modify id int(3); 修改宽度,是修改显示的宽度
- alter table t1 modify id int(8) zerofill; 显示宽度不够,用0补全,在前面补全
- 如果没有zerofill这个限制,select * from t1;查看没什么效果
- ** 注意,修改有无符号,或者补全的时候,都是需要将表里数据清空
- 整数在约束上加上zerofill会自动添加无符号,unsigned
二 浮点数 默认有符号
- 浮点数 默认有符号
- decimal[(m[,d])] [unsigned] [zerofill]
- 准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
- 特别的;对于精确数值计算时需要用此类型
- decaimal能够存储精确值的原因在于其内部按照字符串存储。
- FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 4字节
- 单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
- DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 8字节
- 双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
- 2.1 示例
- create table t1(salary float(5,2));
- insert into t1 values (3.4343);
- inster into t1 values (1111.22); 超出,报错
- 5是宽度限制,2表示小数点位数,所以整数最多3位
- ** 注意,浮点数在约束上加上zerofill会自动添加无符号,unsigned
- 3 位类型 BIT 存储二进制,默认只能存储一位,也就是能存储0,1
- BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
- 注意:对于位字段需要使用函数读取
- bin()显示为二进制
- hex()显示为十六进制
- 3 .1 示例
- create table t1(name bit);
- insert into t1 values(0),(1);
- 插入其他的就会报错了,或者你开始创建表的时候给默认宽度
- create table t1(name bit(4)); 代表四个比特位
- select * from t1; 查看不到因为是二进制
- select bin(x) from t5; 这样查看
- seleect hex(x) from t5; 十进制
三 位类型 BIT 存储二进制,默认只能存储一位,也就是能存储0,1
- 位类型 BIT 存储二进制,默认只能存储一位,也就是能存储0,1
- BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
- 注意:对于位字段需要使用函数读取
- bin()显示为二进制
- hex()显示为十六进制
- 3 .1 示例
- create table t1(name bit);
- insert into t1 values(0),(1);
- 插入其他的就会报错了,或者你开始创建表的时候给默认宽度
- create table t1(name bit(4)); 代表四个比特位
- select * from t1; 查看不到因为是二进制
- select bin(x) from t5; 这样查看
- seleect hex(x) from t5; 十进制
- 3.2 位数1 就是 0 2**0
- 位数2 就是 0 2**1+2**0 以此类推,最多64位,记住二进制的运算
- 通过bin(x)查询的结果就是二进制,
- 比如位数1 插入值是0 or 1结果就是 0 or 1
- 位数2 插入值是0 or 1 or 2 or 3 结果就是 0 or 1 or 10 or 11
四 char与varchar测试
- char 定长(不够凑够固定长度,浪费空间,存取效率快)
- varchar 变长(精准,计算出待放的数据长度,节省空间,效率低)
- 而且存储的时候,还需要存储头,用来取值的时候知道多少位
- 2.1 示例
- create table t1(name char(4)); 表示四个字符,并不是显示字符,显示字符只有数字int是显示宽度
- insert into t1 values('alexsb') 存储不下来,太长了
- insert into t1 values('埃里克斯')
- 2.2 二者区别
- create table t1(x char(5),y varchar(5));
- insert into t1 values('abcdef','abcddd'); 前后都会报错,都不能超过五个
- 区别在于,char 不够五个,用空格补全,varchar 有几个就是几个,但是都不能超五个
- 通过select * from t1;看不出来,需要通过内置函数来查看
- 查看字符长度,char_lenth
- select char_length(x),char_length(y) from t1; char_length :查看字符的长度,好像还是没有区别
- 看到可能还是3个字符,因为char的流氓性,所以需要更改下表限制
- SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; 看到char是定义时候的长度
- 在通过select char_length(x),char_length(y) from t1;查看
- insert into t7 values('你好啊','好你妹'); #char_length :查看字符的长度 5 3
- insert into t7 values('你好啊','好你妹'); #length:查看字节的长度 11 9 utf8中文 一个字符等于3个字节,英文数字就是一个字符就是一个字节
- 2.3 空格
- #注意两点:如果查找条件正好满足限定字符,也是可以查到空格的,前后都可以,但是如果超这个限制,那么只有在后面的空格可以找到
- insert into t7 values('abc ','abc '); #空格算字符,查看字符长度就是 5 4 注意开始前提是给5个限制
- select * from t7 where y='abc '; #去掉末尾的空格然后去比较
- select * from t7 where y=' abc'; #前面是空格就不行了找不到
- 2.4 其他字符串,无非是存储过长超过255的时候,cahr,varchar只支持255个字符,大文件存储就没必要存储在数据库里面
- 效率低,而且大,数据库存储名字,路径就好了
五 日期
- #注册时间
- datetime 2017-09-06 10:39:49
- #出生年月日,开学时间
- date:2017-09-06
- #聊天记录,上课时间
- time:10:39:49
- #出生年
- year:2017
- 3.1 示例
- create table student(
- id int,
- name char(5),
- born_date date,
- born_year year,
- reg_time datetime,
- class_time time
- );
- 插入时间
- insert into student values(1,'alex',now(),now(),now(),now()); now当前时间
- insert into student values(1,'alex','2017-09-06','','2017-09-06 10:39:00','08:30:00');
- 3.2 插入时间的其他插入写法,存储在数据库都是统一的格式,插入写法不一样而已
- insert into student values(1,'alex','2017-09-06',2017,'2017-09-06 10:39:00','08:30:00');
- insert into student values(1,'alex','2017/09/06',2017,'2017-09-06 10:39:00','08:30:00');
- insert into student values(1,'alex','',2017,'','');
六 枚举&集合
- enum 枚举 规定一个范围,可有多个值,但是为该字段插入值时,只能取规定范围中的其中一个
- set 规定一个范围,可有多个值,但是为该字段传值时,能取规定范围中的多个值
- 4.1 示例
- create table student(
- id int primary key auto_increment,
- name char(5),
- sex enum('male','female'), 枚举
- hobbies set('music','read','study','coding') set
- );
- insert into student(name,sex,hobbies) values('egon','None','ddd')
- 查看的时候,就会看到不符合的都是空的,没有找到的也是空
- insert into student(name,sex,hobbies) values('egon','male','music,read')
七 约束条件¬ null&default
- 5.1 not null 与 default
- 5.2 not null 示例
- create table student(
- id int primary key auto_increment, 主键递增
- name char(5),
- sex enum('male','female') not null
- );
- insert into student(name,sex) values('alex',NULL) 插入成功,性别为空
- 需要限制,不能为空
- sex enum('male','female') not null not null就是约束条件
- insert into student(name,sex) values('alex',null) 报错,因为不能空了
- 5.3 default 示例
- create table student(
- id int primary key auto_increment, 主键递增
- name char(5),
- sex enum('male','female') , 默认值就是左边第一个
- age int
- );
- insert into student(name) values('alex'); 查看的效果就是除了名字后面都是NULL
- sex enum('male','female') not null; 有默认参数,默认时第一个参数,还是从左边开始
- sex enum('male','female') not null default 'female'; 修改默认值
- insert into t1(name) values('alex'); 就会看到,sex这块默认是female
- age int not null 加上这个,不为空,默认值是0
- age int not null default 30 不为空,默认值30
八 unique 唯一
- 6.1 示例
- #单列唯一
- create table teacher(
- id int not null unique, 有值且唯一,这样写相当于主键
- name char(10)
- );
- insert into teacher values(1,'egon');
- insert into teacher values(1,'alex');
- 插入报错,因为ID是唯一
- 6.2 #多列唯一
- #255.255.255.255 IP地址最大的状态
- create table services(
- id int primary key auto_increment,
- name char(10),
- host char(15),
- port int,
- constraint host_port unique(host,port)
- );
- constraint 约束的意思,host_port 别名 unique(host,port) 表示这2个字段加起来都是唯一的,联合唯一
- insert into services values('ftp','192.168.20.17',8080);
- insert into services values('httpd','192.168.20.17',8081);
- 6.3 primary key 唯一
- create table t8(x int,y int,primary key(x,y));
- 查看显示2个主键,其实是一个,是x,y和起来的主键
- insert into t1 values(1,2);
- insert into t1 valyes(1,3) 都不会报错,除非是插入后,在插入相同的就会报错了,x,y主键是合起来的
九 auto_increment_offset:偏移量
- 7.1 示例
- create table dep(
- id int primary key auto_increment,
- name char(10)
- );
- insert into dep(name) values('IT'),('HR'),('SALE'),('Boss');
- #修改默认值,从10开始记录ID
- create table dep1(
- id int primary key auto_increment,
- name char(10)
- )auto_increment=10; 修改默认从10开始,就是ID从10开始
- insert into dep1(name) values('IT'),('HR'),('SALE'),('Boss');
- 7.2 #auto_increment_increment:步长
- create table dep2(
- id int primary key auto_increment,
- name char(10)
- );
- set session auto_increment_increment=2; #会话级,只对当前会话有效,退出终端就断了
- set global auto_increment_increment=2; #全局,对所有的会话都有效
- insert into dep1(name) values('IT'),('HR'),('SALE'),('Boss');
- 7.3 #auto_increment_offset和auto_increment_increment组合使用
- 注意:如果auto_increment_offset的偏移量值大于auto_increment_increment的步长值,则auto_increment_offset的值会被忽略
- set session auto_increment_offset=2; 就是从2这个位置开始,第二数据就是5
- set global auto_increment_increment=3;
- show variables like '%auto_in%'; 查看偏移量和步长
- create table dep3(
- id int primary key auto_increment,
- name char(10)
- );
- insert into dep3(name) values('IT'),('HR'),('SALE'),('Boss');
十 foreign key 员工信息表
- 8.1 示例 部门信息
- #先建被关联的表,并且被关联的字段必须唯一
- create table dep(
- id int primary key auto_increment, 不为空,唯一,主键
- department varchar(50),
- comment varchar(100)
- );
- #在创建关联的表 员工信息
- create table emp_info(
- id int primary key auto_increment,
- name varchar(20),
- dep_id int,
- constraint(约束) fk_depid_id foreign key(dep_id) references dep(id) 让员工关联部门
- on delete cascade 不需要先删除/修改被关联的表内容,后面没有逗号 和上面是一行
- on update cascade
- );
- foreign key(dep_id) references dep(id) 创建关联,dep_id自己的字段,references引用关联,dep表的字段
- constraint fk_depid_id 起个别名,跟unique一样
- 8.2 #插入数据
- #先给被关联的表插入数据
- insert into dep values
- (1,'欧德博爱技术有限事业部','说的好'),
- (2,'艾利克斯人力资源部','招不到人'),
- (3,'销售部','卖不出东西');
- #再给关联的表插入数据
- insert into emp_info values
- (1,'egon',1),
- (2,'alex1',2),
- (3,'alex2',2),
- (4,'alex3',2),
- (5,'李坦克',3),
- (6,'刘飞机',3),
- (7,'张火箭',3),
- (8,'林子弹',3),
- (9,'加特林',3);
- 8.3 #删除操作
- delete update
- delete from dep where id=2; 先删除被关联表
- delete from emp_info where dap_id=2; 才能删除关联表
- update user set uid=10 where uid=2; 修改关联表,关联表有修改,但是被关联表没有被修改
- on delete cascade
- on update cascade
- 被关联的表删除或是修改,关联的表也会随之删除或是修改,这才合理
- drop batle t1;删除表的时候,应该先删除被关联表,在删除关联表
python开发mysql:mysql数据类型&约束条件的更多相关文章
- python开发基础之数据类型、字符编码、文件操作
一.知识点 1.身份运算: 2.现在计算机系统通用的字符编码工作方式:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码.用记事本编辑的时候,从文件 ...
- Python开发——2.基本数据类型之数字和字符串
一.基本数据类型 基本数据类型包括:数字(int).字符串(str).列表(list).元祖(tuple).字典(dict).布尔值(bool). 查看输出数据的类型 a = "123&qu ...
- Python开发——3.基本数据类型之列表、元组和字典
一.列表(list) 1.列表的格式 li = [11,22,"kobe",["lakers","ball",11],(11,22,),{& ...
- 【Python开发】查看数据类型
import types aaa = 0 print type(aaa) if type(aaa) is types.IntType: print "the type of aaa is i ...
- MySQL基本数据类型与约束条件
昨日内容回顾 数据存储的演变 # 方向: 朝着更加统一和方便管理 数据库的发展史 # 由本地保存逐步演变为线上保存 数据库的本质 # 本质上就是一款CS架构的软件 """ ...
- Python开发【第十九篇】:Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)
Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...
- Python开发【第十一篇】:Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 1.原生模块pymsql. 2.ORM框架SQLAchemy. pymsql pymsql是Python中操作MySQL的模块,其使用方法和MyS ...
- python开发_python操作mysql数据库
如果你还没有准备好开发环境,你不妨花上一小点时间去看看:python开发_mysqldb安装 本篇blog是有关python操作mysql数据的相关内容. 我做了一个demo: 先看运行效果: mys ...
- Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束
Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎: MySQL中的数据用各种不同的技术存储在文件( ...
随机推荐
- D3.js学习笔记(一)——DOM上的数据绑定
开始学习D3.js,网上没有找到很满意的中文教程,但是发现了一个很好的英文教程,讲解的非常详细.从一个初始简单的HTML网页开始,逐步加入D3.js的应用,几乎是逐句讲解.学习的时候,就顺便翻译成中文 ...
- java Graphics2d消除锯齿,使字体平滑显示
Java 2D API 提供的文本处理功能进行美化.Java 2D API 的文本功能包括: 使用抗锯齿处理和微调(hinting)以达到更好的输出质量 可以使用系统安装的所有字体 可以将对图形对象的 ...
- linux sed使用(转)
sed入门详解教程 sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作.sed 本身是一个非常复杂的工具,有专门的书籍讲解 sed ...
- docker安装脚本
此docker安装脚本为官方提供的,可以从网上下载,此处直接把脚本内容贴上. #!/bin/sh set -e # This script is meant for quick & easy ...
- docker mysql 8.0
Pull library/mysql $ docker pull mysql Load image $ docker load -i mysql.tar Save image $ docker sav ...
- IOS-SQLite3的封装
IWStudent.h // // IWStudent.h // 02-SQLite的封装 // // Created by apple on 14-5-22. // Copyright (c) 20 ...
- 使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)
一.使用ZooKeeper实现Java跨JVM的分布式锁 二.使用ZooKeeper实现Java跨JVM的分布式锁(优化构思) 三.使用ZooKeeper实现Java跨JVM的分布式锁(读写锁) 读写 ...
- 理解 Promise 过程
/** new Promise(fn1).then(function(val){ console.log(val); }) 主要是把 then 的函数抽取出来 , 利用闭包存放在 callback中, ...
- win7 无法链接到手机热点
作为一个对电脑不太懂的小白来说,链接个热点都是问题,来看看我怎么解决的吧. 之前连上过这个手机的热点,隔了有段时间了,今天连不上了,这是啥问题? 另外一台没连过这个手机热点的电脑是可以链接成功了,纳尼 ...
- DataBase project physical design
DataBase physical design //Table: /*student*/ create table student( id int not null primary key, /*学 ...