MySql 主键自动增长
【MySQL】DDL数据定义语言的基本用法create、drop和alter(增删改)

【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⾃增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 及之前的版本,⾃增值保存在内存⾥,并没有持久化。
全国计算机二级MySQL操作题

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数据库外键、主键详解

mysql数据库外键、主键详解⼀、什么是主键、外键:关系型数据库中的⼀条记录中有若⼲个属性,若其中某⼀个属性组(注意是组)能唯⼀标识⼀条记录,该属性组就可以成为⼀个主键⽐如学⽣表(学号,姓名,性别,班级)其中每个学⽣的学号是唯⼀的,学号就是⼀个主键课程表(课程编号,课程名,学分)其中课程编号是唯⼀的,课程编号就是⼀个主键成绩表(学号,课程号,成绩)成绩表中单⼀⼀个属性⽆法唯⼀标识⼀条记录,学号和课程号的组合才可以唯⼀标识⼀条记录,所以学号和课程号的属性组是⼀个主键成绩表中的学号不是成绩表的主键,但它和学⽣表中的学号相对应,并且学⽣表中的学号是学⽣表的主键,则称成绩表中的学号是学⽣表的外键同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性,总结⼀下:1.主键是能确定⼀条记录的唯⼀标识,⽐如,⼀条记录包括⾝份正号,姓名,年龄。
⾝份证号是唯⼀能确定你这个⼈的,其他都可能有重复,所以,⾝份证号是主键。
2.外键⽤于与另⼀张表的关联。
是能确定另⼀张表记录的字段,⽤于保持数据的⼀致性。
⽐如,A表中的⼀个字段,是B表的主键,那他就可以是A表的外键。
⼆、主键、外键和索引的区别sql语句会⾃动判定查询字段有⽆索引,继⽽使⽤索引去检索主键、外键和索引的区别?主键外键索引定义:唯⼀标识⼀条记录,不能有重复的,不允许为空表的外键是另⼀表的主键, 外键可以有重复的, 可以是空值该字段没有重复值,但可以有⼀个空值作⽤:⽤来保证数据完整性⽤来和其他表建⽴联系⽤的是提⾼查询排序的速度个数:主键只能有⼀个⼀个表可以有多个外键⼀个表可以有多个惟⼀索引聚集索引和⾮聚集索引的区别?聚集索引⼀定是唯⼀索引。
但唯⼀索引不⼀定是聚集索引。
聚集索引,在索引页⾥直接存放数据,⽽⾮聚集索引在索引页⾥存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则主键和外键是把多个表组织为⼀个有效的关系数据库的粘合剂。
如何在MySQL中设置自动增长列

如何在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中的自增主键和非自增主键的区别,包括使用场景、性能表现以及对数据操作的影响。
自增主键的特点和应用场景自增主键是指在插入新记录时,数据库自动为主键字段分配一个唯一的递增值。
在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主键设计

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的模式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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还是自增长的。