python开发mysql:mysql数据类型&约束条件

时间:2022-09-21 11:41:00

一 整形

 1 只有Int类型跟存储没有关系,显示的是宽度,其他类型都是限制
2 整形类型;[(m)][unsigned][zerofill]
3 作用;存储年龄,等级,id,各种号码
4 m,代表显示宽度 默认11 其他数据类型标识的就是几个字节,限制几个字节
5 unsigned,代表 限制没有字符
6 zerofill,代表 宽度显示不够,用0补全
7
8 1 整数数字 默认有符号
9 tinyint(1个字节),int(4个字节),bigint(8个字节):注意一下,约束条件和范围
10 常用 int,bigint 其中int最为常用
11 因为有符号的原因,占用了一个bit位,所以在范围上,有无符号有差别的
12 1.1 tinyint(1个字节) 2**8
13 create table t1(id tinyint);
14 alter table t1 modify id tinyint unsigned; 改成无符号,如果有数据 先要清空
15 小整数,数据类型用于保存一些范围的整数数值范围
16 有符号,-128 到 127
17 无符号,0 到 255
18 1.2 int(4个字节) 2**32
19 create table t1(id int);
20 整数,数据类型用于保存一些范围的整数数值范围:
21 有符号,-2147483648 ~ 2147483647
22 无符号,0 ~ 4294967295
23 1.3 bigint(8个字节) 2**64
24 create table t1(id bigint);
25 大整数,数据类型用于保存一些范围的整数数值范围:
26 有符号,-9223372036854775808 ~ 9223372036854775807
27 无符号,0 ~ 18446744073709551615
28
29 1.2 宽度 不指定宽度,默认会有int 11,默认合理合法,11位包含了2**32有无符号都包括了
30 alter table t1 modify id int(3); 修改宽度,是修改显示的宽度
31 alter table t1 modify id int(8) zerofill; 显示宽度不够,用0补全,在前面补全
32 如果没有zerofill这个限制,select * from t1;查看没什么效果
33
34 ** 注意,修改有无符号,或者补全的时候,都是需要将表里数据清空
35 整数在约束上加上zerofill会自动添加无符号,unsigned

 

二 浮点数 默认有符号

 1 浮点数  默认有符号
2 decimal[(m[,d])] [unsigned] [zerofill]
3 准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
4 特别的;对于精确数值计算时需要用此类型
5 decaimal能够存储精确值的原因在于其内部按照字符串存储。
6
7 FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 4字节
8 单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
9
10 DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 8字节
11 双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
12
13 2.1 示例
14 create table t1(salary float(5,2));
15 insert into t1 values (3.4343);
16 inster into t1 values (1111.22); 超出,报错
17 5是宽度限制,2表示小数点位数,所以整数最多3位
18
19 ** 注意,浮点数在约束上加上zerofill会自动添加无符号,unsigned
20
21
22 3 位类型 BIT 存储二进制,默认只能存储一位,也就是能存储0,1
23 BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
24   注意:对于位字段需要使用函数读取
25      bin()显示为二进制
26      hex()显示为十六进制
27 3 .1 示例
28 create table t1(name bit);
29 insert into t1 values(0),(1);
30 插入其他的就会报错了,或者你开始创建表的时候给默认宽度
31 create table t1(name bit(4)); 代表四个比特位
32 select * from t1; 查看不到因为是二进制
33 select bin(x) from t5; 这样查看
34 seleect hex(x) from t5; 十进制

 

 三 位类型 BIT 存储二进制,默认只能存储一位,也就是能存储0,1

 1 位类型 BIT 存储二进制,默认只能存储一位,也就是能存储0,1
2 BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
3   注意:对于位字段需要使用函数读取
4      bin()显示为二进制
5      hex()显示为十六进制
6 3 .1 示例
7 create table t1(name bit);
8 insert into t1 values(0),(1);
9 插入其他的就会报错了,或者你开始创建表的时候给默认宽度
10 create table t1(name bit(4)); 代表四个比特位
11 select * from t1; 查看不到因为是二进制
12 select bin(x) from t5; 这样查看
13 seleect hex(x) from t5; 十进制
14
15 3.2 位数1 就是 0 2**0
16 位数2 就是 0 2**1+2**0 以此类推,最多64位,记住二进制的运算
17 通过bin(x)查询的结果就是二进制,
18 比如位数1 插入值是0 or 1结果就是 0 or 1
19 位数2 插入值是0 or 1 or 2 or 3 结果就是 0 or 1 or 10 or 11

 

四 char与varchar测试

 1  char 定长(不够凑够固定长度,浪费空间,存取效率快)
2 varchar 变长(精准,计算出待放的数据长度,节省空间,效率低)
3 而且存储的时候,还需要存储头,用来取值的时候知道多少位
4
5 2.1 示例
6 create table t1(name char(4)); 表示四个字符,并不是显示字符,显示字符只有数字int是显示宽度
7 insert into t1 values('alexsb') 存储不下来,太长了
8 insert into t1 values('埃里克斯')
9
10 2.2 二者区别
11 create table t1(x char(5),y varchar(5));
12 insert into t1 values('abcdef','abcddd'); 前后都会报错,都不能超过五个
13 区别在于,char 不够五个,用空格补全,varchar 有几个就是几个,但是都不能超五个
14 通过select * from t1;看不出来,需要通过内置函数来查看
15 查看字符长度,char_lenth
16 select char_length(x),char_length(y) from t1; char_length :查看字符的长度,好像还是没有区别
17 看到可能还是3个字符,因为char的流氓性,所以需要更改下表限制
18 SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; 看到char是定义时候的长度
19 在通过select char_length(x),char_length(y) from t1;查看
20 insert into t7 values('你好啊','好你妹'); #char_length :查看字符的长度 5 3
21 insert into t7 values('你好啊','好你妹'); #length:查看字节的长度 11 9 utf8中文 一个字符等于3个字节,英文数字就是一个字符就是一个字节
22
23 2.3 空格
24 #注意两点:如果查找条件正好满足限定字符,也是可以查到空格的,前后都可以,但是如果超这个限制,那么只有在后面的空格可以找到
25 insert into t7 values('abc ','abc '); #空格算字符,查看字符长度就是 5 4 注意开始前提是给5个限制
26 select * from t7 where y='abc '; #去掉末尾的空格然后去比较
27 select * from t7 where y=' abc'; #前面是空格就不行了找不到
28
29 2.4 其他字符串,无非是存储过长超过255的时候,cahr,varchar只支持255个字符,大文件存储就没必要存储在数据库里面
30 效率低,而且大,数据库存储名字,路径就好了

 

五 日期

 1     #注册时间
2 datetime 2017-09-06 10:39:49
3 #出生年月日,开学时间
4 date:2017-09-06
5 #聊天记录,上课时间
6 time:10:39:49
7 #出生年
8 year:2017
9
10 3.1 示例
11 create table student(
12 id int,
13 name char(5),
14 born_date date,
15 born_year year,
16 reg_time datetime,
17 class_time time
18 );
19 插入时间
20 insert into student values(1,'alex',now(),now(),now(),now()); now当前时间
21 insert into student values(1,'alex','2017-09-06','2017','2017-09-06 10:39:00','08:30:00');
22
23 3.2 插入时间的其他插入写法,存储在数据库都是统一的格式,插入写法不一样而已
24 insert into student values(1,'alex','2017-09-06',2017,'2017-09-06 10:39:00','08:30:00');
25 insert into student values(1,'alex','2017/09/06',2017,'2017-09-06 10:39:00','08:30:00');
26 insert into student values(1,'alex','20170906',2017,'20170906103900','083000');

 

六 枚举&集合

 1     enum 枚举 规定一个范围,可有多个值,但是为该字段插入值时,只能取规定范围中的其中一个
2 set 规定一个范围,可有多个值,但是为该字段传值时,能取规定范围中的多个值
3
4 4.1 示例
5 create table student(
6 id int primary key auto_increment,
7 name char(5),
8 sex enum('male','female'), 枚举
9 hobbies set('music','read','study','coding') set
10 );
11 insert into student(name,sex,hobbies) values('egon','None','ddd')
12 查看的时候,就会看到不符合的都是空的,没有找到的也是空
13 insert into student(name,sex,hobbies) values('egon','male','music,read')

 

七 约束条件&not null&default

 1 5.1    not null 与 default
2
3 5.2 not null 示例
4 create table student(
5 id int primary key auto_increment, 主键递增
6 name char(5),
7 sex enum('male','female') not null
8 );
9 insert into student(name,sex) values('alex',NULL) 插入成功,性别为空
10 需要限制,不能为空
11 sex enum('male','female') not null not null就是约束条件
12 insert into student(name,sex) values('alex',null) 报错,因为不能空了
13
14
15 5.3 default 示例
16 create table student(
17 id int primary key auto_increment, 主键递增
18 name char(5),
19 sex enum('male','female') , 默认值就是左边第一个
20 age int
21 );
22 insert into student(name) values('alex'); 查看的效果就是除了名字后面都是NULL
23 sex enum('male','female') not null; 有默认参数,默认时第一个参数,还是从左边开始
24 sex enum('male','female') not null default 'female'; 修改默认值
25 insert into t1(name) values('alex'); 就会看到,sex这块默认是female
26 age int not null 加上这个,不为空,默认值是0
27 age int not null default 30 不为空,默认值30

 

八 unique 唯一

 1 6.1 示例
2 #单列唯一
3 create table teacher(
4 id int not null unique, 有值且唯一,这样写相当于主键
5 name char(10)
6 );
7 insert into teacher values(1,'egon');
8 insert into teacher values(1,'alex');
9 插入报错,因为ID是唯一
10
11 6.2 #多列唯一
12 #255.255.255.255 IP地址最大的状态
13 create table services(
14 id int primary key auto_increment,
15 name char(10),
16 host char(15),
17 port int,
18 constraint host_port unique(host,port)
19 );
20 constraint 约束的意思,host_port 别名 unique(host,port) 表示这2个字段加起来都是唯一的,联合唯一
21 insert into services values('ftp','192.168.20.17',8080);
22 insert into services values('httpd','192.168.20.17',8081);
23
24 6.3 primary key 唯一
25 create table t8(x int,y int,primary key(x,y));
26 查看显示2个主键,其实是一个,是x,y和起来的主键
27 insert into t1 values(1,2);
28 insert into t1 valyes(1,3) 都不会报错,除非是插入后,在插入相同的就会报错了,x,y主键是合起来的

 

九 auto_increment_offset:偏移量

 1 7.1 示例
2 create table dep(
3 id int primary key auto_increment,
4 name char(10)
5 );
6 insert into dep(name) values('IT'),('HR'),('SALE'),('Boss');
7 #修改默认值,从10开始记录ID
8 create table dep1(
9 id int primary key auto_increment,
10 name char(10)
11 )auto_increment=10; 修改默认从10开始,就是ID从10开始
12 insert into dep1(name) values('IT'),('HR'),('SALE'),('Boss');
13
14 7.2 #auto_increment_increment:步长
15 create table dep2(
16 id int primary key auto_increment,
17 name char(10)
18 );
19 set session auto_increment_increment=2; #会话级,只对当前会话有效,退出终端就断了
20 set global auto_increment_increment=2; #全局,对所有的会话都有效
21 insert into dep1(name) values('IT'),('HR'),('SALE'),('Boss');
22
23 7.3 #auto_increment_offset和auto_increment_increment组合使用
24 注意:如果auto_increment_offset的偏移量值大于auto_increment_increment的步长值,则auto_increment_offset的值会被忽略
25 set session auto_increment_offset=2; 就是从2这个位置开始,第二数据就是5
26 set global auto_increment_increment=3;
27 show variables like '%auto_in%'; 查看偏移量和步长
28
29 create table dep3(
30 id int primary key auto_increment,
31 name char(10)
32 );
33 insert into dep3(name) values('IT'),('HR'),('SALE'),('Boss');

 

十 foreign key 员工信息表

python开发mysql:mysql数据类型&约束条件

 1 8.1 示例  部门信息
2 #先建被关联的表,并且被关联的字段必须唯一
3 create table dep(
4 id int primary key auto_increment, 不为空,唯一,主键
5 department varchar(50),
6 comment varchar(100)
7 );
8
9 #在创建关联的表 员工信息
10 create table emp_info(
11 id int primary key auto_increment,
12 name varchar(20),
13 dep_id int,
14 constraint(约束) fk_depid_id foreign key(dep_id) references dep(id) 让员工关联部门
15 on delete cascade 不需要先删除/修改被关联的表内容,后面没有逗号 和上面是一行
16 on update cascade
17 );
18 foreign key(dep_id) references dep(id) 创建关联,dep_id自己的字段,references引用关联,dep表的字段
19 constraint fk_depid_id 起个别名,跟unique一样
20
21 8.2 #插入数据
22 #先给被关联的表插入数据
23 insert into dep values
24 (1,'欧德博爱技术有限事业部','说的好'),
25 (2,'艾利克斯人力资源部','招不到人'),
26 (3,'销售部','卖不出东西');
27
28 #再给关联的表插入数据
29 insert into emp_info values
30 (1,'egon',1),
31 (2,'alex1',2),
32 (3,'alex2',2),
33 (4,'alex3',2),
34 (5,'李坦克',3),
35 (6,'刘飞机',3),
36 (7,'张火箭',3),
37 (8,'林子弹',3),
38 (9,'加特林',3);
39
40 8.3 #删除操作
41 delete update
42 delete from dep where id=2; 先删除被关联表
43 delete from emp_info where dap_id=2; 才能删除关联表
44 update user set uid=10 where uid=2; 修改关联表,关联表有修改,但是被关联表没有被修改
45 on delete cascade
46 on update cascade
47 被关联的表删除或是修改,关联的表也会随之删除或是修改,这才合理
48
49 drop batle t1;删除表的时候,应该先删除被关联表,在删除关联表