MySql 主键自动增长
- 格式:docx
- 大小:35.45 KB
- 文档页数:4
【MySQL】DDL数据定义语⾔的基本⽤法create、drop和alter(增删改)DDL 的基础语法⽂章⽬录简单复习⼀波 SQL必知必会DDL 的英⽂全称是 Data Definition Language(数据定义语⾔),它定义了数据库的结构和数据表的结构。
在 DDL 中,我们常⽤的功能是增删改,分别对应的命令是 CREATE、DROP 和 ALTER。
对数据库进⾏定义建数据库的基本SQL语法格式为:CREATE DATABASE database_name;//创建⼀个名为 database_name 的数据库“database_name”为要创建的数据库的名称,该名称不能与已经存在的数据库重名。
mysql> CREATE DATABASE database_name;Query OK, 1 row affected (0.00 sec)mysql> CREATE DATABASE database_name;ERROR 1007 (HY000): Can't create database 'database_name'; database exists删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将⼀同被删除。
删除数据库的基本SQL语法格式为:DROP DATABASE database_name;//删除⼀个名为 database_name 的数据库“database_name”为要删除的数据库的名称。
若指定的数据库不存在,则删除出错。
mysql> DROP DATABASE database_name;Query OK, 0 rows affected (0.00 sec)mysql> DROP DATABASE database_name;ERROR 1008 (HY000): Can't drop database 'database_name'; database doesn't exist在这⾥插⼊图⽚描述mysql> CREATE DATABASE database_name;Query OK, 1 row affected (0.00 sec)mysql> CREATE DATABASE database_name;ERROR 1007 (HY000): Can't create database 'database_name'; database existsmysql> SHOW CREATE DATABASE database_name;+---------------+------------------------------------------------------------------------+| Database | Create Database |+---------------+------------------------------------------------------------------------+| database_name | CREATE DATABASE `database_name` /*!40100 DEFAULT CHARACTER SET utf8 */ |+---------------+------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> DROP DATABASE database_name;Query OK, 0 rows affected (0.00 sec)mysql> SHOW CREATE DATABASE database_name;ERROR 1049 (42000): Unknown database 'database_name'CREATE DATABASE mysqlcrashcourse;// 创建⼀个名为 mysqlcrashcourse 的数据库DROP DATABASE mysqlcrashcourse;// 删除⼀个名为 mysqlcrashcourse 的数据库对数据表进⾏定义创建表结构的语法是这样的:CREATE TABLE table_name;创建⼀个名为 table_name的表⼀般要写⾄少写⼀⾏ A table must have at least 1 column,后⾯介绍如何创建表结构创建⼀个名为 table_name的表mysql> CREATE DATABASE database_name;Query OK, 1 row affected (0.00 sec)mysql> USE database_name;Database changedmysql> CREATE TABLE table_name;ERROR 1113 (42000): A table must have at least 1 columnmysql> CREATE TABLE table_name( name VARCHAR(50) NOT NULL);Query OK, 0 rows affected (0.01 sec)mysql> show tables;+-------------------------+| Tables_in_database_name |+-------------------------+| table_name |+-------------------------+1 row in set (0.00 sec)mysql> CREATE TABLE table_name( name VARCHAR(50) NOT NULL);ERROR 1050 (42S01): Table 'table_name' already existsmysql>删除表的基本SQL语法格式为:DROP TABLE table_name;DROP TABLE [IF EXISTS] table_name;DROP TABLE table_name;删除⼀个名为 table_name的表DROP TABLE IF EXISTS table_name;执⾏了这条语句如果存在table_name表就删除,不存在不会报错也是执⾏。
关于mysql⾃增id,你需要知道的导读:在使⽤MySQL建表时,我们通常会创建⼀个⾃增字段(AUTO_INCREMENT),并以此字段作为主键。
本篇⽂章将以问答的形式讲述关于⾃增id的⼀切。
注:本⽂所讲的都是基于Innodb存储引擎。
1.MySQL为什么建议将⾃增列id设为主键?如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第⼀个不包含有NULL值的唯⼀索引作为主键索引、如果也没有这样的唯⼀索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着⾏记录的写⼊⽽主键递增,这个ROWID不像ORACLE的ROWID那样可引⽤,是隐含的)。
数据记录本⾝被存于主索引(⼀颗B+Tree)的叶⼦节点上。
这就要求同⼀个叶⼦节点内(⼤⼩为⼀个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有⼀条新的记录插⼊时,MySQL 会根据其主键将其插⼊适当的节点和位置,如果页⾯达到装载因⼦(InnoDB默认为15/16),则开辟⼀个新的页(节点)如果表使⽤⾃增主键,那么每次插⼊新的记录,记录就会顺序添加到当前索引节点的后续位置,当⼀页写满,就会⾃动开辟⼀个新的页如果使⽤⾮⾃增主键(如果⾝份证号或学号等),由于每次插⼊主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置⽽移动数据,甚⾄⽬标页⾯可能已经被回写到磁盘上⽽从缓存中清掉,此时⼜要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了⼤量的碎⽚,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页⾯。
综上⽽⾔:当我们使⽤⾃增列作为主键时,存取效率是最⾼的。
2.⾃增列id⼀定是连续的吗?⾃增id是增长的不⼀定连续。
我们先来看下MySQL 对⾃增值的保存策略:InnoDB 引擎的⾃增值,其实是保存在了内存⾥,并且到了 MySQL 8.0 版本后,才有了“⾃增值持久化”的能⼒,也就是才实现了“如果发⽣重启,表的⾃增值可以恢复为 MySQL 重启前的值”,具体情况是:在 MySQL 5.7 及之前的版本,⾃增值保存在内存⾥,并没有持久化。
1.一个用于存放学生选课信息的数据库XK,由学生信息表student、课程信息表course和选课信息表ordering构成。
其中,表student记录学生的学号、、性别、年龄等信息;表course记录课程的课程号、课程名称、授课教室等信息;表ordering描述学生的选课信息,并记录学生所选课程的成绩。
在考生文件夹下已创建了数据库XK、表student、表course和表ordering,并初始化了相应数据,请考生查阅其结构与数据,完成下列操作。
注意:以下操作题必须编写相应的SQL语句,并至少执行一次该命令。
1) 使用UPDATE语句,将表student中字段stu_id为0002的学生年龄更新为"20"。
2) 使用SELECT语句查询学生信息表中所有男生的,且按年龄的升序排序,最后把此SELECT语句存入考生文件夹下的sj12.txt文件中。
3) 使用SELECT语句查询课程成绩不与格的学生,并此SELECT语句存入考生文件夹下的sj13.txt文件中。
4) 建立一个名为stu_user的用户,并为其授予关于表student的SELECT、INSERT权限。
5) 使用INSERT语句向表ordering中添加如下一条信息:学号为0001的学生选修了课程号为005的课程,因该课程尚未结束,故目前没有成绩。
1) 使用如下SQL语句可在数据库XK中创建一个触发器,其实现在表student中删除学生信息时,可自动删除该学生的选课信息。
注意:在考生文件夹中的sj21.txt文件已给出部分程序,但程序不完整,请考生在横线处填上适当的容后并把横线删除,使程序补充完整,并按原文件名保存在考生文件夹下,否则没有成绩。
2) 使用如下SQL语句可在数据库XK中创建一个存储过程,用于实现给定表course中一个课程号course_id,即可为表course中该课程号所对应的课程指定一个新的授课教室。
mysql数据库外键、主键详解⼀、什么是主键、外键:关系型数据库中的⼀条记录中有若⼲个属性,若其中某⼀个属性组(注意是组)能唯⼀标识⼀条记录,该属性组就可以成为⼀个主键⽐如学⽣表(学号,姓名,性别,班级)其中每个学⽣的学号是唯⼀的,学号就是⼀个主键课程表(课程编号,课程名,学分)其中课程编号是唯⼀的,课程编号就是⼀个主键成绩表(学号,课程号,成绩)成绩表中单⼀⼀个属性⽆法唯⼀标识⼀条记录,学号和课程号的组合才可以唯⼀标识⼀条记录,所以学号和课程号的属性组是⼀个主键成绩表中的学号不是成绩表的主键,但它和学⽣表中的学号相对应,并且学⽣表中的学号是学⽣表的主键,则称成绩表中的学号是学⽣表的外键同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性,总结⼀下:1.主键是能确定⼀条记录的唯⼀标识,⽐如,⼀条记录包括⾝份正号,姓名,年龄。
⾝份证号是唯⼀能确定你这个⼈的,其他都可能有重复,所以,⾝份证号是主键。
2.外键⽤于与另⼀张表的关联。
是能确定另⼀张表记录的字段,⽤于保持数据的⼀致性。
⽐如,A表中的⼀个字段,是B表的主键,那他就可以是A表的外键。
⼆、主键、外键和索引的区别sql语句会⾃动判定查询字段有⽆索引,继⽽使⽤索引去检索主键、外键和索引的区别?主键外键索引定义:唯⼀标识⼀条记录,不能有重复的,不允许为空表的外键是另⼀表的主键, 外键可以有重复的, 可以是空值该字段没有重复值,但可以有⼀个空值作⽤:⽤来保证数据完整性⽤来和其他表建⽴联系⽤的是提⾼查询排序的速度个数:主键只能有⼀个⼀个表可以有多个外键⼀个表可以有多个惟⼀索引聚集索引和⾮聚集索引的区别?聚集索引⼀定是唯⼀索引。
但唯⼀索引不⼀定是聚集索引。
聚集索引,在索引页⾥直接存放数据,⽽⾮聚集索引在索引页⾥存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则主键和外键是把多个表组织为⼀个有效的关系数据库的粘合剂。
如何在MySQL中设置自动增长列MySQL是一款流行的关系型数据库管理系统,被广泛应用于各种应用程序中。
在数据库中,经常需要给表添加一个自动增长的列,来确保每个记录都有一个唯一的标识符。
本文将介绍如何在MySQL中设置自动增长列,以及一些相关的注意事项。
1. 了解自动增长列的概念和用途自动增长列是一种特殊的列类型,在插入数据时会自动为每一条记录生成一个唯一的标识符。
它通常用于表的主键字段,以确保每个记录都具有唯一的标识符。
自动增长列的值会依次递增,从而方便查询和管理数据。
2. 创建表时设置自动增长列在创建表时,可以使用AUTO_INCREMENT关键字来设置自动增长列。
例如,创建一个名为"users"的表,其中包含"id"和"name"两个字段,其中"id"字段需要设置为自动增长列的主键。
可以使用以下语句来创建表:CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50));在上述语句中,关键字AUTO_INCREMENT用于设置"id"字段为自动增长列,并且将其设为主键。
每次插入一条新记录时,MySQL会自动为"id"字段生成一个唯一的值。
3. 修改已有表的字段为自动增长列如果已经有一个表,而且想将某个字段设置为自动增长列,可以使用ALTER TABLE语句进行修改。
例如,假设已有一个名为"users"的表,其中包含"id"和"name"两个字段,现在需要将"id"字段设置为自动增长列。
可以使用以下语句来进行修改:ALTER TABLE usersMODIFY COLUMN id INT AUTO_INCREMENT PRIMARY KEY;在上述语句中,使用MODIFY COLUMN关键字来修改"id"字段的属性。
MySQL中的自增主键和非自增主键区别引言在数据库管理系统中,主键是一种用于唯一标识表中记录的字段。
MySQL作为一种常用的关系型数据库管理系统,提供了自增主键和非自增主键两种常见的主键类型。
本文将探讨MySQL中的自增主键和非自增主键的区别,包括使用场景、性能表现以及对数据操作的影响。
自增主键的特点和应用场景自增主键是指在插入新记录时,数据库自动为主键字段分配一个唯一的递增值。
在MySQL中,使用整数类型的字段通常作为自增主键,其中最常用的是自增长整数类型INT和BIGINT。
自增主键的特点如下:1. 唯一性:自增主键保证了每个记录的主键值都是唯一的,避免了数据冲突和重复。
2. 索引性能:自增主键作为表的主键,对于查询和数据检索操作具有较高的效率。
数据库系统会自动为自增主键字段创建索引,加快数据查找速度。
3. 简单性和易用性:自增主键的使用非常简单,只需将主键字段的属性设置为AUTO_INCREMENT即可。
对于应用程序开发者和数据库管理员而言,可以更加方便地处理数据记录。
自增主键适用于那些对于主键值的大小、顺序以及自动性十分关注的应用场景。
例如,电商平台的订单编号、博客系统的文章ID等。
这些场景中,自增主键可以确保主键值的唯一性和连续性,方便对数据进行排序和快速检索。
非自增主键的特点和应用场景非自增主键是指在插入新记录时,由应用程序或数据库管理员手动提供主键值。
与自增主键相比,非自增主键的特点如下:1. 灵活性:非自增主键可以使用不同的数据类型,如整数、字符串等,在满足唯一性的前提下,可以根据实际需求自由选择主键值。
2. 控制性:由于非自增主键的主键值由用户或管理员指定,可以更加精确地控制主键值的范围和取值规则。
3. 外键关联:非自增主键可以方便地与其他表进行关联,建立外键关系。
这在数据库设计中是非常常见的需求,能够提高数据库的数据完整性和一致性。
非自增主键适用于那些对于主键值的特定要求和处理逻辑的应用场景。
⾃动增长字段在设计数据库的时候,有时需要表的某个字段是⾃动增长的,最常使⽤⾃动增长字段的就是表的主键,使⽤⾃动增长字段可以简化主键的⽣成。
不同的DBMS 中⾃动增长字段的实现机制也有不同,下⾯分别介绍。
MYSQL中的⾃动增长字段MYSQL中设定⼀个字段为⾃动增长字段⾮常简单,只要在表定义中指定字段为AUTO_INCREMENT即可。
⽐如下⾯的SQL语句创建T_Person表,其中主键FId为⾃动增长字段:CREATE TABLE T_Person(FId INT PRIMARY KEYAUTO_INCREMENT,FName VARCHAR(20),FAge INT);执⾏上⾯的SQL 语句后就创建成功了T_Person 表,然后执⾏下⾯的SQL 语句向T_Person表中插⼊⼀些数据:INSERT INTO T_Person(FName,FAge)VALUES(‘Tom’,18);INSERT INTO T_Person(FName,FAge)VALUES(‘Jim’,81);INSERT INTO T_Person(FName,FAge)VALUES(‘Kerry’,33);注意这⾥的INSERT语句没有为FId字段设定任何值,因为DBMS会⾃动为FId字段设定值。
执⾏完毕后查看T_Person表中的内容:FId FName FAge1 Tom 182 Jim 813 Kerry 33可以看到FId中确实是⾃动增长的。
MSSQLServer 中的⾃动增长字段MSSQLServer中设定⼀个字段为⾃动增长字段⾮只要在表定义中指定字段为IDENTITY即可,格式为IDENTITY(startvalue,step),其中的startvalue参数值为起始数字,step参数值为步长,即每次⾃动增长时增加的值。
⽐如下⾯的SQL语句创建T_Person表,其中主键FId为⾃动增长字段,并且设定100 为起始数字,步长为3:CREATE TABLE T_Person(FId INT PRIMARY KEY IDENTITY(100,3),FName VARCHAR(20),FAge INT);执⾏上⾯的SQL 语句后就创建成功了T_Person 表,然后执⾏下⾯的SQL 语句向T_Person表中插⼊⼀些数据:INSERT INTO T_Person(FName,FAge)VALUES(‘Tom’,18);INSERT INTO T_Person(FName,FAge)VALUES(‘Jim’,81);INSERT INTO T_Person(FName,FAge)VALUES(‘Kerry’,33);注意这⾥的INSERT语句没有为FId字段设定任何值,因为DBMS会⾃动为FId字段设定值。
mysql主键long_MySQL主键设计[TOC]在项⽬过程中遇到⼀个看似极为基础的问题,但是在深⼊思考后还是引出了不少问题,觉得有必要把这⼀学习过程进⾏记录。
MySQL主键设计原则MySQL主键应当是对⽤户没有意义的。
MySQL主键应该是单列的,以便提⾼连接和筛选操作的效率永远也不要更新MySQL主键MySQL主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等MySQL主键应当有计算机⾃动⽣成。
主键设计的常⽤⽅案⾃增ID优点:1、数据库⾃动编号,速度快,⽽且是增量增长,聚集型主键按顺序存放,对于检索⾮常有利。
2、 数字型,占⽤空间⼩,易排序,在程序中传递⽅便。
缺点:1、不⽀持⽔平分⽚架构,⽔平分⽚的设计当中,这种⽅法显然不能保证全局唯⼀。
2、表锁在MySQL5.1.22之前,InnoDB⾃增值是通过其本⾝的⾃增长计数器来获取值,该实现⽅式是通过表锁机制来完成的(AUTO-INC LOCKING)。
锁不是在每次事务完成后释放,⽽是在完成对⾃增长值插⼊的SQL语句后释放,要等待其释放才能进⾏后续操作。
⽐如说当表⾥有⼀个auto_increment字段的时候,innoDB会在内存⾥保存⼀个计数器⽤来记录auto_increment的值,当插⼊⼀个新⾏数据时,就会⽤⼀个表锁来锁住这个计数器,直到插⼊结束。
如果⼤量的并发插⼊,表锁会引起SQL堵塞。
在5.1.22之后,InnoDB为了解决⾃增主键锁表的问题,引⼊了参数innodb_autoinc_lock_mode:0:通过表锁的⽅式进⾏,也就是所有类型的insert都⽤AUTO-inc locking(表锁机制)。
1:默认值,对于simple insert ⾃增长值的产⽣使⽤互斥量对内存中的计数器进⾏累加操作,对于bulk insert 则还是使⽤表锁的⽅式进⾏。
2:对所有的insert-like ⾃增长值的产⽣使⽤互斥量机制完成,性能最⾼,并发插⼊可能导致⾃增值不连续,可能会导致Statement 的Replication 出现不⼀致,使⽤该模式,需要⽤ Row Replication的模式。
mysql雪花算法主键_自增长idUUID雪花算法MySQL是一个广泛使用的关系型数据库管理系统,常用于Web应用程序的后端存储。
在MySQL中,使用自增长的整数作为主键是一种常见的做法,可以方便地进行记录的唯一标识和排序。
然而,当分布式系统需要使用MySQL作为存储后端时,自增长的整数会面临一些问题。
首先,自增长的整数在分布式环境下很难保证全局唯一性,因为每个节点都可能使用相同的自增长序列,导致产生重复的主键值。
其次,自增长的整数在一些特殊应用场景下可能会造成热点,即一些节点频繁地插入记录,导致该节点的性能瓶颈。
为了解决上述问题,可以采用UUID作为主键,UUID(Universally Unique Identifier)是一种128位长的全局唯一标识符。
UUID使用网络地址和时间戳的组合来保证全球范围内的唯一性。
然而,UUID作为主键也存在一些问题,首先,它的长度较长,会占用更多的存储空间。
其次,由于UUID的生成算法是随机的,会导致插入记录时的IO开销增加。
为了解决上述问题,可以采用雪花算法(Snowflake Algorithm)生成主键,雪花算法是Twitter开发的一种分布式唯一ID生成算法。
雪花算法的核心思想是将一个64位的长整型分为多个部分,分别表示时间戳、数据中心ID、机器ID和序列号。
其中,时间戳表示生成ID的时间,数据中心ID和机器ID用于标识生成ID的节点,序列号用于解决同一节点的并发生成ID问题。
雪花算法生成的ID具有以下特点:1.全局唯一性:由于每个节点的数据中心ID和机器ID都是唯一的,加上时间戳和序列号,保证了整个分布式集群内生成的ID的唯一性。
2.单调递增性:生成的ID按时间戳递增排序,方便进行查询和排序操作。
3.高性能:雪花算法生成ID的开销较小,不依赖于数据库的自增长机制,提高了插入记录的性能。
使用雪花算法生成主键的步骤如下:1.定义一个64位的长整型变量,分别表示时间戳、数据中心ID、机器ID和序列号。
MySQL中的自动增量与自动编号的实现方法在MySQL数据库中,自动增量和自动编号是常见的需求。
自动增量是指在插入新数据时,系统自动帮助我们生成一个唯一的标识符,以保证数据的唯一性和易于查询。
而自动编号则是在插入新数据时,系统根据一定的规则自动生成一个编号,便于我们对数据进行管理和统计。
本文将介绍MySQL中实现自动增量和自动编号的方法。
一、自动增量的实现方法在MySQL中,实现自动增量最常用的方式就是使用自增主键。
自增主键可以保证每次插入新数据时,系统会自动为其生成一个唯一的标识符。
下面以创建一个自增主键为例,介绍其实现方法。
1. 创建一个表首先,我们需要创建一个带有自增主键的表。
假设我们要创建一个名为"users"的表,并添加一个自增主键字段"ID"和一个用户名称字段"Name",则可以使用以下命令创建表:```CREATE TABLE users (ID INT(11) AUTO_INCREMENT PRIMARY KEY,Name VARCHAR(50));```在上述命令中,通过使用关键字"AUTO_INCREMENT"来指定ID字段为自增主键,并且设置为主键后使用"PRIMARY KEY"进行标记。
2. 插入数据接下来,我们可以向表中插入数据,系统会自动为每条数据生成一个唯一的ID。
例如,我们插入一条数据:```INSERT INTO users (Name) VALUES ('Tom');```此时,系统会自动为该条数据分配一个唯一的ID值,我们可以使用以下命令查询:```SELECT * FROM users;```可以看到查询结果中,每条数据都具有一个独一无二的ID值。
二、自动编号的实现方法除了使用自增主键来实现自动增量外,还可以使用其他方法来实现自动编号。
下面介绍两种常见的实现方法:使用触发器和使用存储过程。
黑马程序员:数据库MYSQL今日内容介绍◆MySQL数据库◆SQL语句第1章数据库1.1数据库概述●什么是数据库数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
●什么是数据库管理系统数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。
用户通过数据库管理系统访问数据库中表内的数据.●常见的数据库管理系统MYSQL :开源免费的数据库,小型的数据库。
已经被Oracle收购了.MySQL6.x版本也开始收费。
Oracle :收费的大型数据库,Oracle公司的产品。
Oracle收购SUN公司,收购MYSQL。
DB2 :IBM公司的数据库产品,收费的.常应用在银行系统中.SQLServer:MicroSoft 公司收费的中型的数据库.C#、。
net等语言常使用。
SyBase :已经淡出历史舞台。
提供了一个非常专业数据建模的工具PowerDesigner。
SQLite :嵌入式的小型数据库,应用在手机端。
Java相关的数据库:MYSQL,Oracle.这里使用MySQL数据库。
MySQL中可以有多个数据库,数据库是真正存储数据的地方.●数据库与数据库管理系统的关系1.2数据库表数据库中以表为组织单位存储数据。
表类似我们的Java类,每个字段都有对应的数据类型。
那么用我们熟悉的java程序来与关系型数据对比,就会发现以下对应关系.类——-———-—-—表类中属性——--————--表中字段对象———-——-———记录1.3表数据根据表字段所规定的数据类型,我们可以向其中填入一条条的数据,而表中的每条数据类似类的实例对象.表中的一行一行的信息我们称之为记录。
表记录与java类对象的对应关系第2章MySql数据库2.1MySql安装安装参考MySQL安装图解.doc安装后,MySQL会以windows服务的方式为我们提供数据存储功能。
Mysql:设置主键⾃动增长起始值⽐较郁闷昨天在家使⽤‘alter table `tablename` AUTO_INCREMENT=10000;’怎么也不起效,但是今天下班时间公司⼀同事尝试了⼀下就可以了。
搞不明⽩⾃⼰当时是怎么操作的,导致最终不起效。
实现⽬标:mysql下将⾃增主键的值,从10000开始,即实现⾃增主键的种⼦为10000。
⽅案1)使⽤alter table `tablename` AUTO_INCREMENT=10000创建⾃增主键之后,使⽤alter table `tablename` AUTO_INCREMENT=10000实现修改表起始值。
drop table if exists `trace_test`;CREATE TABLE `trace_test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;alter table `trace_test` AUTO_INCREMENT=10000;insert into `trace_test`(`name`)values('name2');select*from `trace_test`;Result:id name10000 name2⽅案2)创建表时设置AUTO_INCREMENT 10000参数drop table if exists `trace_test`;CREATE TABLE `trace_test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT 10000DEFAULT CHARSET=utf8 ;insert into `trace_test`(`name`)values('name2');select*from `trace_test`;Result:id name10000 name23)如果表已有数据,truncate 之后设置auto_increment=10000,可⾏。
mysql数据库的基本使⽤命令总结mysql数据库是⼀个常⽤的关系型数据库关系型数据库核⼼元素有哪些?主键:特殊字段,⽤来唯⼀标识记录的唯⼀性字段:数据列记录:数据⾏数据表:数据⾏的集合数据库:数据表的集合安装、启动、停⽌、重启mysql服务器的命令安装:sudo apt-get install mysql-server启动:sudo service mysql start# 查看进程中是否存在mysql服务 ps ajx|grep mysql停⽌:sudo service mysql stop重启:sudo service mysql restartmysql 数据库的操作1.连接数据库mysql -u root -pmysql不显⽰密码连接python@ubuntu:~/Desktop$ mysql -u root -pEnter password: mysql退出数据库ctrl+l:清除命令屏幕quit\exit2.创建数据库create database 数据库名 charset=utf8;### 创建数据库时⼀定要记得解决编码问题3.查看当前使⽤的数据库: select database();查看所以数据库: show databases;查看当前数据库中所有表: show tabes;查看当前表中所有的列: select * from 表名;查看表结构: desc 表名;4. 1)创建表需要⽤到的数据类型:整数: int,bit #int unsigned:⽆符号整形 #tinyint unsigned:⽆符号整形(但范围⽐较⼩,⼀般⽤于年龄) #.bit是位数据类型,长度为1字节;int 是整型;bit 实际就是bool类型,只能是0和1,int的是4个字节的整型⼩数: decimal #decimal(5,2)表⽰五位数字,两位⼩数点字符串: varchar,char #varchar:可变字符串⽇期时间: date, time, datetime枚举类型: enum主键: primary key⾃动增长(增加): atuo_increment默认值: default不能为空: not null外键: foreign keyin2)表格式:create table 数据表名字(id ⽆符号整形主键⾃动增长(增加) 不能为空; name 可变字符串(数字/范围) 默认值'';age ⽆符号整形默认值0;height ⼩数;gender 枚举默认值;foreign key ⽆符号整形默认值);例如:create table t_students(id int unsigned primary key auto_increment not null,name varchar(10) default '',age tinyint unsigned default 0,height decimal(5,2),gender enum('男','⼥','中性','保密') default '保密',cls_id int unsigned default 0);5.查看创建数据库的语句: show create database 库名查看创建表的语句: show create table 表名6.使⽤数据库: use 数据库名删除数据库: drop database 数据库名删除表: drop table 表名删除表--删除字段(列)alter table 表名 drop 列名7.表的修改:1)修改表-添加字段 kouhao (班级⼝号)alter table 表名 add 列名类型及约束;alter table t_classes add kouhao varchar(20) not null default '⼈⽣苦短,我⽤Python';2)修改表-修改字段:重命名版alter table 表名 change 原名新名类型及约束;alter table t_classes change kouhao logo varchar(20);3)修改表-修改字段:不重命名版alter table 表名 modify 列名类型及约束;alter table t_classes modify logo varchar(20) not null default '⼈⽣苦短,我⽤Python';8.数据的增删改查(curd)curd的解释: 代表创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)1)增加1.全列插⼊insert [into] 表名 values(...) #into可⽤可不⽤主键字段可以⽤ 0 null default 来占位如:向classes表中插⼊⼀个班级insert into t_classes values(0,'python02');insert into t_classes values(0,'python01');如:向students表插⼊⼀个学⽣信息(id,name,age,height,gender,cls_id)insert t_students values(null,'⼤乔',23,165.12,'男',1);insert t_students values(null,'李⽩',23,180.12,'⼥',1);2.部分插⼊insert into 表名(列1,...) values(值1,...)insert into t_students(name,gender) values ('张飞',1); #这⾥张飞后⾯的⼀是创建表时,列表性别列对象的枚举参数顺序3.多⾏插⼊insert into 表名(name,gender) values("⼩张1",1),("⼩张2",2);insert into t_students(name,gender) values('⼩王',2),('⼤王',3);2)修改update 表名 set 列1=值1,列2=值2... where 条件;1.全部修改update t_students set height=188.88 ;2.按条件修改update t_students set gender='⼥' where id=1;3.按条件修改多个值update students set gender ="",name = "xxx" ;update t_students set height=165.60,gender=1 where id=3;3)查询1.查询所有列select * from 表名;select * from t_students;2.指定条件查询select * from t_students where name='李⽩';3.查询指定列select 列1,列2,... from 表名;select name,age from t_students;4)删除1.物理删除 #删除后不可恢复delete from 表名 where 条件delete from t_students where id=4;2.逻辑删除 #对要删除的对象做标记,可恢复(⽤⼀个字段来表⽰这条信息是否已经不能再使⽤了)需要给students表添加⼀个 isdelete 字段 bit 类型才能进⾏逻辑删除isdelete=1 就是代表删除标记;is_delete=0 就是恢复 #⽤⼆进制0和1表⽰update t_students set isdelete=1 where id=5 ;。
MySQL中的自动增长列和序列号生成器MySQL是一种常用的关系型数据库管理系统,被广泛应用于各行各业的软件开发中。
在数据库表的设计中,自动增长列和序列号生成器是两个常见的概念和技术。
它们在数据表设计和数据操作中发挥着重要的作用,本文将对这两个概念进行深入探讨。
一、自动增长列的定义和使用在MySQL中,自动增长列是指表中的一个列,该列的值会根据事先定义的规则自动生成并递增。
这样的列通常用作主键或唯一标识符,保证每条记录在此列上的值都是唯一的。
自动增长列的定义非常简单,只需在创建表时,在该列的数据类型后加上关键字"auto_increment"即可。
例如,下面是一个学生表的创建语句,其中的id列就是自动增长列:CREATE TABLE student (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),age INT);在向该表插入数据时,如果没有为id列指定具体的值,数据库会自动为该列生成一个递增的值。
例如,执行以下插入语句:INSERT INTO student (name, age) VALUES ('张三', 18);INSERT INTO student (name, age) VALUES ('李四', 20);则数据库会将id列的值分别设为1和2。
如果继续执行插入语句:INSERT INTO student (name, age) VALUES ('王五', 22);则id列的值会自动设为3。
这样,我们就可以通过自动增长列来方便地获取每条记录的唯一标识符,实现数据间的关联和查询操作。
二、自动增长列的使用注意事项在使用自动增长列时,需要注意以下几点:1. 自动增长列只能用于整数类型的列。
在创建表时,需将自动增长列的数据类型设置为INT、BIGINT等整数类型,以保证能够存储自动生成的递增值。
[MySQL数据库之表的约束条件:primarykey、auto_increment、no。
[MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建⽴关联]表的约束条件约束条件与数据类型的宽度⼀样,都是可选参数作⽤:⽤于保证数据的完整性和⼀致性主要分为:PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯⼀的标识记录FOREIGN KEY (FK) 标识该字段为该表的外键NOT NULL 标识该字段不能为空UNIQUE KEY (UK) 标识该字段的值是唯⼀的AUTO_INCREMENT 标识该字段的值⾃动增长(整数类型,⽽且为主键)DEFAULT 为该字段设置默认值UNSIGNED ⽆符号ZEROFILL 使⽤0填充说明:1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值2. 字段是否有默认值,缺省的默认值是NULL,如果插⼊记录时不给字段赋值,此字段使⽤默认值sex enum('male','female') not null default 'male'age int unsigned NOT NULL default 20 必须为正值(⽆符号)不允许为空默认是203. 是否是key主键 primary key外键 foreign key索引 (index,unique...)primary key从约束⾓度看primary key字段的值不为空且唯⼀主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引组织表,⼀张表中必须有且只有⼀个主键。
⼀个表中可以:单列做主键多列做主键(复合主键)主键通常都是id字段:对于以后建的表都是innodb存储引擎的,在建表的时候⼀定要有id,id⼀定得是主键create table t3(id int primary key);insert t3 values(1);联合主键(了解)create table t5(id int,name varchar(10),primary key(id,name));insert t5 values(1,"egon"); -- 正常插⼊insert t5 values(1,"tom"); -- 正常插⼊insert t5 values(1,"egon"); -- 重复,报错auto_increment约束字段为⾃动增长,被约束的字段必须同时被key约束create table t6(id int primary key auto_increment,name varchar(16));insert t6(name) values("geng"); -- 给name插⼊值insert t6(name) values("yang"); -- 给name插⼊值insert t6(name) values("sun"); -- 给name插⼊值not null与default是否可空,null表⽰空,⾮字符串not null - 不可空null - 可空default - 默认值,创建列时可以指定默认值,当插⼊数据时如果未主动设置,则⾃动添加默认值设置id字段有默认值后,则⽆论id字段是null还是not null,都可以插⼊空,插⼊空默认填⼊default指定的默认值create table t7(id int not null,name varchar(16));insert t7 values(null,"geng");create table t8(id int not null default 0,name varchar(16));insert t8(name) values("geng");uniqueunique设置唯⼀约束,不允许重复create table t9(id int unique,name varchar(16));insert t9 values(1,"geng");insert t9 values(1,"yang"); -- 报错id重复补充知识:not null+unique的化学反应create table t10(id int not null unique,name varchar(16));id 字段变成了主键:不为空且唯⼀mysql> create table t10(-> id int not null unique,-> name varchar(16)-> );Query OK, 0 rows affected (0.24 sec)mysql> desc t10;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id | int(11) | NO | PRI | NULL | || name | varchar(16) | YES | | NULL | |+-------+-------------+------+-----+---------+-------+2 rows in set (0.02 sec)foreign key员⼯信息表有三个字段:⼯号姓名部门公司有3个部门,但是有1个亿的员⼯,那意味着部门这个字段需要重复存储,部门名字越长,越浪费解决⽅法:我们完全可以定义⼀个部门表然后让员⼯信息表关联该表,如何关联,即foreign key表与表之间建⽴关联多对⼀关系创建表时需要先建⽴被关联表create table dep(id int primary key auto_increment,name varchar(20),comment varchar(50));再创建关联表(同步更新,同步删除)create table emp(id int primary key auto_increment,name varchar(16),age int,dep_id int,foreign key(dep_id) references dep(id)on update cascadeon delete cascade);插⼊数据时,应该先往dep插⼊数据,再往emp插⼊数据insert dep(name,comment) values("IT","搞技术"),("sale","卖东西"),("HR","招聘");insert emp(name,age,dep_id) values("egon",18,1),("tom",19,2),("lili",28,2),("jack",38,1),("lxx",78,3);》》加了foreign key之后级联更新级联删除会带来额外的效果更新dep,emp中对应的数据跟着改update dep set id=33 where name ="HR";删除dep,emp中对应的数据跟着删除delete from dep where id=2;# 删除dep表中的id为2的销售部门,emp表中对应dep销售部门的员⼯也跟着删除了mysql> delete from dep where id=2;Query OK, 1 row affected (0.23 sec)mysql> select * from dep;+----+------+-----------+| id | name | comment |+----+------+-----------+| 1 | IT | 搞技术 || 33 | HR | 招聘 |+----+------+-----------+2 rows in set (0.00 sec)mysql> select * from emp;+----+------+------+--------+| id | name | age | dep_id |+----+------+------+--------+| 1 | egon | 18 | 1 || 4 | jack | 38 | 1 || 5 | lxx | 78 | 33 |+----+------+------+--------+3 rows in set (0.00 sec)多对多关系egon 九阳神功egon 祥龙⼗⼋掌egon 易筋经egon 九阴真经egon 葵花宝典jason 九阳神功jason 祥龙⼗⼋掌lxx 易筋经lxx 九阴真经hxx 祥龙⼗⼋掌hxx 易筋经hxx 九阴真经# 多个作者编写⼀本书# ⼀个作者编写多本书create table author(id int primary key auto_increment,name varchar(16));create table book(id int primary key auto_increment,name varchar(20));create author2book(id int primary key auto_increment,author_id int,book_id int,foreign key(author_id) references author(id)on update cascadeon delete cascade,foreign key(book_id) references book(id)on update cascadeon delete cascade);⼀对⼀关系#⼀定是student来foreign key表customer,这样就保证了:#1 学⽣⼀定是⼀个客户,#2 客户不⼀定是学⽣,但有可能成为⼀个学⽣create table customer(id int primary key auto_increment,name varchar(20) not null,qq varchar(10) not null,phone char(16) not null);create table student(id int primary key auto_increment,class_name varchar(20) not null,customer_id int unique, # 该字段⼀定要是唯⼀的foreign key(customer_id) references customer(id) # 外键的字段⼀定要保证unique on delete cascadeon update cascade);# 增加客户insert into customer(name,qq,phone) values('蔡⼦奇','31811231',138********),('孙宗伟','123123123',152********),('胡⽟康','283818181',1867141331),('刘洋','283818181',1851143312),('杨逸轩','888818181',1861243314),('杨杰','112312312',188********);# 增加学⽣insert into student(class_name,customer_id) values('⽜逼1班',3),('装逼2班',4),('装逼2班',5);如何找出两张表之间的关系>>分析步骤:1、先站在左表的⾓度去找是否左表的多条记录可以对应右表的⼀条记录,如果是,则证明左表的⼀个字段foreign key 右表⼀个字段(通常是id)2、再站在右表的⾓度去找是否右表的多条记录可以对应左表的⼀条记录,如果是,则证明右表的⼀个字段foreign key 左表⼀个字段(通常是id)3、总结:# 多对⼀:如果只有步骤1成⽴,则是左表多对⼀右表如果只有步骤2成⽴,则是右表多对⼀左表# 多对多如果步骤1和2同时成⽴,则证明这两张表时⼀个双向的多对⼀,即多对多,需要定义⼀个这两张表的关系表来专门存放⼆者的关系# ⼀对⼀:如果1和2都不成⽴,⽽是左表的⼀条记录唯⼀对应右表的⼀条记录,反之亦然。
MySQL中的自增主键原理和最佳实践自增主键是MySQL中常用的一种数据类型,它可以自动生成唯一的、递增的数值作为记录的标识。
本文将介绍MySQL中的自增主键的原理以及最佳实践。
一、自增主键的原理在MySQL中,自增主键是通过自增长属性来实现的。
当定义了一个字段为自增长属性时,MySQL将自动为每次插入的记录生成一个独一无二的数值,并在下一次插入时自动递增。
这个自动生成的数值可以作为记录的主键,用于唯一地标识一条记录。
自增主键可以使用整数类型,比如INT、BIGINT等。
在定义字段时,需要将其属性设置为AUTO_INCREMENT,以表示该字段是一个自增长属性。
在实际使用中,我们可以通过查看表的定义来确定哪个字段是自增主键,使用DESCRIBE命令或者SHOW CREATE TABLE命令都可以查看表的定义。
二、自增主键的最佳实践1.选择合适的自增主键数据类型在选择自增主键的数据类型时,需要根据数据量的大小来选择合适的整数类型。
如果预计数据量较小,可以选择INT类型;如果预计数据量较大,可以选择BIGINT类型。
选择合适的数据类型有助于节省存储空间,并提高查询性能。
2.避免在事务中使用自增主键在事务中使用自增主键可能会导致性能问题。
因为自增主键的生成是基于表中的当前最大值,并且在插入操作之后才会自增,所以在事务中,每次插入记录时都需要锁定表并查找当前最大值,这可能会造成性能瓶颈。
因此,建议在事务中避免使用自增主键,可以使用其他方式来生成唯一标识。
3.使用分布式唯一标识在分布式系统中,如果多个节点同时插入记录,并且使用自增主键来标识记录,可能会出现冲突的情况。
为了避免这种情况,可以使用分布式唯一标识,比如UUID。
UUID是一个128位的值,几乎可以保证在全球范围内的唯一性。
4.仅在需要时使用自增主键自增主键是一种方便的方式来生成唯一标识,但并不是所有的表都需要自增主键。
在设计数据库时,应根据实际需求来决定是否使用自增主键。
MySQL中主键与rowid的使⽤陷阱总结前⾔⼤家在MySQL中我们可能听到过rowid的概念,但是却很难去测试实践,不可避免会有⼀些疑惑,⽐如:如何感受到rowid的存在;rowid和主键有什么关联关系;在主键的使⽤中存在哪些隐患;如何来理解rowid的潜在瓶颈并调试验证。
本⽂要和⼤家⼀起讨论这⼏个问题,测试的环境基于MySQL 5.7.19版本。
问题1、如何感受到rowid的存在我们不妨通过⼀个案例来进⾏说明。
记得有⼀天统计备份数据的时候,写了⼀条SQL,当看到执⾏结果时才发现SQL语句没有写完整,在完成统计⼯作之后,我准备分析下这条SQL语句。
mysql> select backup_date ,count(*) piece_no from redis_backup_result;+-------------+----------+| backup_date | piece_no |+-------------+----------+| 2018-08-14 | 40906 |+-------------+----------+1 row in set (0.03 sec)根据业务特点,⼀天之内肯定没有这么多的记录,明显不对,到底是哪⾥出了问题呢。
⾃⼰仔细看了下SQL,发现是没有加group by,我们随机查出10条数据。
mysql> select backup_date from redis_backup_result limit 10;+-------------+| backup_date |+-------------+| 2018-08-14 || 2018-08-14 || 2018-08-14 || 2018-08-15 || 2018-08-15 || 2018-08-15 || 2018-08-15 || 2018-08-15 || 2018-08-15 || 2018-08-15 |+-------------+10 rows in set (0.00 sec)在早期的版本中数据库参数sql_mode默认为空,不会校验这个部分,从语法⾓度来说,是允许的;但是到了⾼版本,⽐如5.7版本之后是不⽀持的,所以解决⽅案很简单,在添加group by之后,结果就符合预期了。
MySql 主键自动增长
Mysql,SqlServer,Oracle主键自动增长设置
1、把主键定义为自动增长标识符类型
MySql
在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。
例如:
createtable customers(id int auto_increment primarykey not null, name varchar(15));
insertinto customers(name) values("name1"),("name2");
select id from customers;
以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值。
最后查询表中id字段,查询结果为:
由此可见,一旦把id设为auto_increment类型,mysql数据库会自动按递增的方式为主键赋值。
Sql Server
在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。
例如:
createtable customers(id int identity(1,1) primarykey not null, name varchar(15));
insertinto customers(name) values('name1'),('name2');
select id from customers;
注意:在sqlserver中字符串用单引号扩起来,而在mysql中可以使用双引号。
查询结果和mysql的一样。
由此可见,一旦把id设为identity类型,MS SQLServer数据库会自动按递增的方式为主键赋值。
identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。
以前经常会碰到这样的问题,当我们删除了一条自增长列为1的记录以后,再次插入的记录自增长列是2了。
我们想在插入一条自增长列为1的记录是做不到的。
今天跟同事讨论的时候发现可以通过设置SET IDENTITY_INSERT <table_name> ON;来取消自增长,等我们插入完数据以后在关闭这个功能。
实验如下:
use TESTDB2
--step1:创建表
createtable customers(
id int identity primarykey not null,
name varchar(15)
);
--step2:执行插入操作
insertinto customers(id,name) values(1,'name1');
--报错:An explicit value for the identity column in table 'customers' can only be specified when a column list is used and IDENTITY_INSERT is ON.
--step3:放开主键列的自增长
SETIDENTITY_INSERT customers ON;
--step4:插入两条记录,主键分别为1和3。
插入成功
insertinto customers(id,name) values(1,'name1');
insertinto customers(id,name) values(3,'name1');
--step5:再次插入一个主键为2的记录。
插入成功
insertinto customers(id,name) values(2,'name1');
--step6:插入重复主键,
--报错:Violation of PRIMARY KEY constraint 'PK__customer__3213E83F00551192'.Cannot insert duplicate key in object 'dbo.customers'.
insertinto customers(id,name) values(3,'name1');
--step7:关闭IDENTITY_INSERT
SETIDENTITY_INSERT customers OFF;
2、从序列中获取自动增长的标识符
Oracle
在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。
例如一下语句创建了一个名为customer_id_seq的序列,这个序列的起始值为1,增量为2。
create sequence customer_id_seq increment by2 start with1
一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval属性。
∙curval:返回序列的当前值
∙nextval:先增加序列的值,然后返回序列值
以下sql语句先创建了customers表,然后插入两条记录,在插入时设定了id和name字段的值,其中id字段的值来自于customer_id_seq序列。
最后查询customers表中的id字段。
createtable customers(id intprimarykey not null, name varchar(15));
insertinto customers values(customer_id_seq.nextval, 'name1');
insertinto customers values(customer_id_seq.nextval, 'name2');
select id from customers;
如果在oracle中执行以上语句,查询结果为:
通过触发器自动添加id字段
从上述插入语句可以发现,如果每次都要插入customer_id_seq.nextval的值会非常累赘与麻烦,因此可以考虑使用触发器来完成这一步工作。
创建触发器trg_customers
create or replace
trigger trg_customers before inserton customers for each row
begin
select CUSTOMER_ID_SEQ.nextval into :new.id from dual;
end;
插入一条记录
insertinto customers(name) values('test');
这是我们会发现这一条记录被插入到数据库中,并且id还是自增长的。