Python-数据类型 主键auto_increment
MySQL数据操作: DML
========================================================
在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,
包括:
使用INSERT实现数据的插入
UPDATE实现数据的更新
使用DELETE实现数据的删除
使用SELECT查询数据以及。
======================================================== 1.详细的建表语句 *****
create table 表名(
字段名1 数据类型[(长度) 约束条件],
字段名2 数据类型[(长度) 约束条件]
); 解释:
类型:使用限制字段必须以什么样的数据类型传值
约束条件:约束条件是在类型之外添加一种额外的限制
为什么需要给数据分类?(189 一八九)
1.描述数据更加准确
2.节省内存空间
注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选,字段名和类型是必须的
3、最后一个字段后不加逗号
create database db37; insert 语句
insert into 表名 values(值1,值n,....)
要求值得顺序 个数 必须与表字段完全对应
另一种写法
insert into 表名(字段名1,字段名n,....) values(值1,值n,....)
可以选择性得插入某些字段 要求值得顺序 必须与表名后面声明得字段一致 2.数据类型 *****
整数类型
1、作用:id号,各种号码,年龄,等级
2、分类:
整型的存储宽度是规定死的,我们指定宽度是显示宽度,通常使用默认的显示宽度
tinyint(**)1字节 (-128,127)
smallint 2字节
mediumint 3字节
int (*****) 4字节
bigint(***)8字节 3、测试:
默认有符号的
设置为无符号unsigned
1.create table t2(age tinyint unsigned);
2.建表后用alter修改 create table t2(x tinyint unsigned);
insert into t2 values(-1),(256); create table t4(x int(12) unsigned);
insert into t4 values(4294967296123); 4、强调:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制
所以在创建表示,如果字段采用的是整型类型,完全无需指定显示宽度,
默认的显示宽度,足够显示完整当初存放的数据 zerofill
# 显示时,不够8位用0填充,如果超出8位则正常显示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);
insert into t5 values(1); 总结:除了存储范围没啥区别
都是整型
默认有符号
对于显示宽度 原理是相同的 长度参数如果不指定 会有默认值(3) 严格模式
什么是严格模式
对插入的数据严格要求 不再范围内直接报错
例如往tinyint中插入大于255的值将报错
什么是非严格模式
不对插入的数据严格要求 不再范围内也可以保存
保存的当前类型最大支持的值 5.6默认是非严格模式
5.7以后默认严格模式 查看SQL模式
select @@sql_mode;
show variables like "sql_mode";
show variables like "%sql_mode%"; 修改SQL模式
set @@sql_mode = "值";
正常情况不需要改
+----------------------------+---------------------+
| Variable_name | Value |
+----------------------------+---------------------+
| binlogging_impossible_mode | IGNORE_ERROR |
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | OFF |
| pseudo_slave_mode | OFF |
| slave_exec_mode | STRICT |
| sql_mode | STRICT_TRANS_TABLES |
+----------------------------+---------------------+
8 rows in set (0.00 sec) #修改sql_mode为严格模式:在该模式下,如果插入的数据超过限制,则会立即报错
mysql> set global sql_mode="strict_trans_tables"; 浮点类型
作用:存储身高、体重、薪资
分类:
float (*****)4字节 单精度浮点 满足大部分使用场景
double (**)8字节双精度浮点
decimal (**)不固定 精准小数 适合银行系统 科学研究等
create table t9(num float(m,d))
m 表示总长度 d 表示小数部分的长度
长度表示不是数据存储范围 而是字符长度
10.12 总长为4 小数部分为2 各个类型的最大长度
float (255,30) ***** 括号内不填,默认没有小数,整数非零的数字显示6位
double (255,30)
decimal (65,30) 区别:
float与double的精度不同 都是不准确的小数
decimal 准确的小数 不会丢失精度 括号中m和d的值 可以限制数据存储范围 与整型不同
重点:记住m和d的含义
测试:
#相同点
1、对于三者来说,都能存放30位小数,
#不同点:
1、精度的排序从低到高:float,double,decimal
2、float与double类型能存放的整数位比decimal更多 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); mysql> select * from t9;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec) mysql> select * from t10;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec) mysql> select * from t11;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.00 sec) 字符串类型
1、作用:姓名,地址,描述类的信息 2、分类:
char 定长字符串 使用频率更高
varchar 可变长度字符串
注意字符串中 长度指定的是数据的字符长度 与字节没关系 create table t13(c1 char,c2 varchar(10));
在创建时 varchar必须指定长度 char有默认值 (1) 不同点:
a char(3) b char(3)
A |B |
char类型在取数据时 就根据长度来获取 不关心真实数据长度
无论的数据有多长 占用的空间是固定的 造成了一定空间浪费
name char(5)
# 缺点:浪费空间
# 优点:存取速度都快
egon alex lxx wxx yx a varchar(30) b varchar(30)
(1)A(1)B
varchar类型在取数据时 先获取数据长度 在根据长度获取真实数据 关心真实数据长度
先存储长度需要一个字节 再存储真实数据 不会浪费空间
但是 由于需要计算数据的长度 所以存取速度会比定长慢
name varchar(5)
# 缺点:存取速度都慢
# 优点:节省空间
(1bytes+egon)(1bytes+alex)(1bytes+lxx) 相同点:
括号中的数字 都是表示存储最大字符长度 mysql会在存储数据时自动将数据末尾的空格去掉
如果必须要存空格 需要修改sql_mode 增加 PAD_CHAR_TO_FULL_LENGTH 意思是把空格当作有效数据 # 注意:
由于自动去除空格这个机制 在使用等于符号 和like时有区别
select *from t1 where name = "yh "; name字段明确地等于一个值,该值后填充空格是没有用,会自动去除空格
select *from t1 where name like "yh "; name字段模糊匹配一个值,该值后填充空格是有用的,不会自动去除空格
like 用于模糊匹配 使用%表示0或任意个任意字符 使用_表示一个任意字符 3、测试:字符的宽度限制单位是字符个数
create table t12(x char(4)); # 超出4个字符则报错,不够4个字符则用空格补全成4个字符
create table t13(y varchar(4));# 超出4个字符则报错,不够4个字符那么字符有几个就存几个 insert into t12 values('hello');
insert into t13 values('hello'); insert into t12 values('a'); #'a '
insert into t13 values('a'); #'a' 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 日期和时间
1、作用:时间相关
2、分类:
year:1999
date:1999-01-27
time: 11:11:11
datetime*****:1999-01-27 11:11:11
timestamp *****
timestamp特点是:可以给null 自动输入当前时间 当这条记录被修改了会自动更新当前时间
3、测试
create table student(
id int,
name char(16),
born_year year,
birth date,
class_time time,
reg_time datetime
); insert into student values(1,'egon','2000','2000-01-27','08:30:00','2013-11-11 11:11:11'); 枚举
枚举enum,多选一个
enum 可以指定一堆字符串的值 在插入数据时 数据必须这堆字符串中的其中一个 ("男的","女的") 多选一
集合
集合set,多选多
set 可以指定一堆字符串的值 在插入数据时 数据必须这堆字符串中的其中一个或多个 ("男的","女的") 多选多
枚举和集合共同点:数据都是字符串类型
测试
create table teacher(
id int,
name char(16),
sex enum('male','female','others'),
hobbies set('play','read','music','piao')
);
insert into teacher values('male','read,music') 3.约束****
是一种对数据限制
已经学习过的 数据类型 unsigned无符号 字符串长度 浮点的长度 约束的作用是?
为了保证数据的正确性,完整性
例如要存储密码 char(20) 只限制了类型和长度, 无法保证数据的正确性 额外的约束
语法:
创建时指定约束
create table 表名称(字段名 类型(长度) 约束名称1 约束名称n,....)
后期修改的方式添加 约束
alter table 表名称 modify 字段名 类型(长度) 约束名称1 约束名称n,....
unsigned 整形,无符号
NOT NULL 非空约束 限制该字段的值不能为空
UNIQUE 唯一性约束 限制该字段的值是唯一的不能出现重复
DEFAULT 默认值约束 如果插入数据时没有指定该字段的值则使用默认值
PRIMARY KEY 主键约束 限制该字段 不能为空 并且是唯一的 可以唯一标识一条数据 *****
FOREIGN KEY 外键约束 用来指向另一个表的主键
auto_increment 自动增长,只能加在整形上且必须有索引和key配合,默认起始位置是1,步长也为1 mysql中存在一种专门的数据结构,叫key,又称为索引,通过该数据结构可以减少io次数,从而加速查询效率
index key : 只有加速查询的效果,没有约束的功能
unique key:不仅有加速查询的效果,还附加了一种约束的功能
primary key:不仅有加速查询的效果,还附加了一种约束的功能,并且innodb存储引擎会按照主键字段的值
来组织表中所有的数据,所以一种inndob表中必须有、而且只能有一个主键,通常该表的id字段 #not null + default测试
create table t15(
id int,
name char(16) not null,
sex enum('male','female','other') not null default "male"
); alter table t15 modify name char(16) not null; insert into t15(id,name) values
(1,'egon1'),
(2,'egon2'),
(3,'egon3'); 每一个表都应该有一个主键 需要唯一标识 否则可以可能出现完全相同的两个数据 无法区分
UNIQUE 不能重复 但是可以为空 这样也不能唯一标识
UNIQUE NOT NULL 不能为空且唯一 可以唯一标识一条数据 书写顺序无所谓 UNIQUE NOT NULL 与 主键的区别
UNIQUE NOT NULL 不能被其他表引用 (不能作为其它表的外键)
UNIQUE NOT NULL 约束一个表中可以有多个 但是主键只能有一个
#unique:限制字段的值唯一 #单列唯一
create table t16(
id int unique,
name char(16)
); # 联合唯一
create table server(
id int unique,
ip char(15),
port int,
unique(ip,port) #!!!!!
); 索引:用于加速查询
InnoDB 中 索引是树形结构
为了提高查询效率 InnoDB为找一个不为空 且唯一的字段作为主键
如果表中不存在这样的字段 会自动帮你建一个隐藏主键字段 但是无法提升查询效率 只要是使用innoDB 就应该为每个表指定一个非空 且唯一的字段
InnoDB阻止数据时 首先使用主键 如果没有主键 找一个非空且唯一 如果也没有 建一个隐藏字段 多字段联合主键: 不常用
学生表 stu_id course_id 做为联合主键,只有当两个字段都重复才算重复
1 1 已有数据
1 2 可以插入
2 1 可以插入
1 1 不能插入 #primary key:单单从约束角度去看,primary key就等同于not null unique
#强调(******)
1、一张表中必须有,并且只能有一个主键
2、一张表中都应该有一个id字段,而且应该把id字段做成主键
如一张表中没有主键,第一个not null unique的字段会默认成为主键 create table t17(
id int primary key,
name char(16),
age int,
sex char(6)
)engine=innodb; #联合主键
create table t19(
ip char(15),
port int,
primary key(ip,port) #!!!!
); # auto_increment注意点:
1、通常与primary key连用,而且通常是给id字段加
2、auto_incremnt只能给被定义成key(unique key,primary key)的字段加 # primary key auto_increment
create table t20(
id int primary key auto_increment,
name char(16)
)engine=innodb; 当一个表中 由于业务需求没有一个非空且唯一的字段时 我们可以建一个新的字段专门作为主键
管理主键的值挺麻烦的 你得记录上一次的主键值
mysql可以帮你自动管理主键 auto_increment 自动增长
auto_increment 只能用于整型字段 并且该字段必须具备索引
所以 通常 主键都会加上auto_increment 手动修改自动增长计数
alter table 表名 auto_increment 新的值;
注意:如果新的值小于当前的最大值 是无效的 通常建一个表就要建一个主键 主键的类型通常是整型 存储引擎 mysql中建立的库===>文件夹
库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:
比如处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。
而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎 发动机
汽油机
柴油机 柴油价格便宜 动力还强 噪音大 不完全燃烧
电机 加速快 噪音小 续航问题 一个产品或服务的核心部分称之为引擎
mysql的核心功能存取数据
mysql存储引擎就是负责存取数据那一段代码 InnoDB!!! 默认,支持事物,行级锁,外键,支持外键,存储时1个文件
MyISAM 不支持事物,表级锁,不支持外键. 支持存储结构体 ,例如point x坐标y坐标 支持空间索引,存储时3个文件(数据,结构,事务)
Blackhole 写进去就没了
Memory 存在内存中 断电易失
Python-数据类型 主键auto_increment的更多相关文章
- JDBC 复习5 mysql 的自增长主键 auto_increment
MySQL 自增长主键 (1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号.编号从1开始,并1为基数递增. (2)把0插入AUTO_INCRE ...
- MYSQL主键自动增加的配置及auto_increment注意事项
文章一 原文地址: http://ej38.com/showinfo/mysql-202971.html 文章二: 点击转入第二篇文章 在数据库应用,我们经常要用到唯一编号.在MySQL中可通过字 ...
- mysql创建,添加主键
primary key 1.最简单的: CREATE TABLE t1( id int not null, name char(20)); 2.带主键的: a:CREATE TABLE t1( id ...
- MYSQL获取自增主键【4种方法】
通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键.本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值: 通过JDBC2.0提 ...
- MYSQL获取自增主键【4种方法】(转)
转自:http://blog.csdn.net/ultrani/article/details/9351573 作者已经写的非常好了,我不废话了,直接转载收藏: 通常我们在应用中对mysql执行了in ...
- (转) Hibernate持久化类与主键生成策略
http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...
- oracle 实现主键id自增
公司现在项目数据库使用oracle,oracle实现表主键自增比mysql麻烦 mysql 在表主键auto_increment 打钩即可.oracle没有改属性,就相对麻烦.特此记录一下自增方法 测 ...
- mysql 创建表 索引 主键 引擎 自增 注释 编码等
CREATE TABLE text(id INT(20) COMMENT '主键',NAME VARCHAR(20) COMMENT '姓名',PASSWORD VARCHAR(20) COMMENT ...
- MySQL8自增主键变化
MySQL8自增主键变化 醉后不知天在水,满船清梦压星河. 一.简述 MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看. 比如系统表引擎的 ...
随机推荐
- Mac OS X 启用超级用户 sudo -s 获得系统权限 Mac终端命令
为了防止误操作破坏系统,用户状态下时没有权限操作系统重要文件, 所以先要取得root权限:“sudo -s” 详见:https://www.jianshu.com/p/138b98e662ed
- JDK源码之数组
序言 <1>栈内存和堆内存当一个方法执行时,每个方法都会建立自己的内存栈,在这方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁.所有在方法中定义的 ...
- Android GreenDao使用教程
1.在build.gradle里添加相关依赖 apply plugin: 'org.greenrobot.greendao' buildscript { repositories { mavenCen ...
- 二十五、Linux 进程与信号---exec函数
25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...
- luogu 2569 股票交易 单调队列dp
注意转移方程 分1.凭空买 2.不买不卖 3.在原来基础上买 4.在原来基础上卖 四种情况 head=1,tail=0;再判断一下head<=tail也可以 #include<bits/s ...
- seleniums私房菜系列一 ---- selenium简介
一.Selenium是什么? Selenium是ThroughtWorks公司一个强大的开源Web功能测试工具系列,本系列现在主要包括以下4款: 1.Selenium Core:支持DHTML的测试案 ...
- labelImg 工具
安装anaconda, 在anaconda prompt 下 执行 pyrcc4 -o resources.py resources.qrc python labelImg.py
- (15)DeleteColumnsMakeSortedIII
一.问题描述 给定一个字符串形的数组,求最小的删除数目,使得删除后的字符串是字典型有序的. 二.思路Code package algorithm; /** * Created by adrian.wu ...
- 服务器多站点多域名HTTPS实现
假设有这样一个场景,我们有多个站点(例如site1.marei.com,site2.marei.com和site3.marei.com)绑定到同一个IP:PORT,并区分不同的主机头.我们为每一个SS ...
- ssm框架所需jar包整理及各jar包的作用
以下是我目前新搭建的ssm项目的pom.xml 之后如果需要其他的话再加 <?xml version="1.0" encoding="UTF-8"?> ...