-
一、创建与删除数据库
-
在与数据进行任何其他操作之前,需要创建一个数据库。数据库是数据的容器。它可以用于存储联系人,供应商,客户或任何想存储的数据。 在MySQL中,数据库是用于存储和操作诸如表,数据库视图,触发器,存储过程等数据的对象的集合。
要在MySQL中创建数据库,请使用
CREATE DATABASE
语句,如下: -
create database [if not exists] database_name;
我们来更详细地看看
CREATE DATABASE
语句:CREATE DATABASE
语句的后面是要创建的数据库名称。建议数据库名称尽可能是有意义和具有一定的描述性。IF NOT EXISTS
是语句的可选子句。IF NOT EXISTS
子句可防止创建数据库服务器中已存在的新数据库的错误。不能在MySQL数据库服务器中具有相同名称的数据库。
- 显示数据库
-
show databases;
选择要使用的数据库
- 在使用指定数据库之前,必须通过使用
USE
语句告诉MySQL要使用哪个数据库。 -
USE database_name;
删除数据库
- drop database语句
-
drop database [if exists] database_name;
-
二、表类型和存储过程
在本教程中,您将学习各种MySQL表类型或存储引擎。了解MySQL中每个表类型的功能至关重要,以便您可以有效地使用它们来最大限度地提高数据库的性能。
MySQL为其表提供了各种存储引擎,它们分别如下所示:
- MyISAM
- InnoDB
- MERGE
- MEMORY(HEAP)
- ARCHIVE
- CSV
- FEDERATED
每个存储引擎都有自己的优点和缺点。了解每个存储引擎功能至关重要,并为表选择最合适的功能,以最大限度地提高数据库的性能。 在以下部分中,我们将讨论每个存储引擎及其功能,以便您可以决定使用哪个引擎合适。
MyISAM
MyISAM扩展了以前的ISAM存储引擎。 MyISAM表针对压缩和速度进行了优化。 MyISAM表也可以在平台和操作系统之间移植。
MyISAM表的大小可达
256TB
,这个数据里是非常巨大的。 此外,MyISAM表可以压缩为只读表以节省空间。 在启动时,MySQL会检查MyISAM表是否有损坏,甚至在出现错误的情况下修复它们。MyISAM表不是事务安全的。在MySQL 5.5之前,MyISAM是创建表但是不用明确指定存储引擎时的默认存储引擎。 从版本5.5起,MySQL使用InnoDB作为默认存储引擎。
InnoDB
InnoDB表完全支持符合ACID和事务。 它们也是性能最佳的。InnoDB表支持外键,提交,回滚,前滚操作。InnoDB表的大小最多可达
64TB
。像MyISAM一样,InnoDB表可以在不同的平台和操作系统之间移植。如果需要,MySQL还会在启动时检查和修复InnoDB表。
MERGE
MERGE表是将具有相似结构的多个MyISAM表组合到一个表中的虚拟表。MERGE存储引擎也被称为MRG_MyISAM引擎。 MERGE表没有自己的索引; 它会使用组件表的索。
使用MERGE表,可以在连接多个表时加快性能。MySQL只允许您对MERGE表执行SELECT,DELETE,UPDATE和INSERT操作。如果在
MERGE
表上使用DROP TABLE
语句,则仅删除MERGE
规范。基础表不会受到影响。Memory
内存表存储在内存中,并使用散列索引,使其比MyISAM表格快。内存表数据的生命周期取决于数据库服务器的正常运行时间。内存存储引擎以前称为HEAP。
Archive
归档存储引擎允许将大量用于归档目的的记录存储为压缩格式以节省磁盘空间。 归档存储引擎在插入时压缩记录,并在读取时使用
zlib
库对其进行解压缩。归档表只允许INSERT和
SELECT
语句。ARCHIVE
表不支持索引,因此需要完整的表扫描来读取行。CSV
CSV存储引擎以逗号分隔值(CSV)文件格式存储数据。 CSV表格提供了将数据迁移到非SQL应用程序(如电子表格软件)中的便捷方式。
CSV表不支持
NULL
数据类型。 此外,读操作需要全表扫描。FEDERATED
FEDERATED存储引擎允许从远程MySQL服务器管理数据,而无需使用集群或复制技术。本地联合表不存储任何数据。 从本地联合表查询数据时,数据将从远程联合表自动拉出。
-
三、create table 语法
- 下面以简单的形式来说明
CREATE TABLE
语句的语法: -
CREATE TABLE [IF NOT EXISTS] table_name( column_list ) engine=table_type;
-
首先,指定要在
CREATE TABLE
子句之后创建的表的名称。表名在数据库中必须是唯一的。IF NOT EXISTS
是语句的可选部分,允许您检查正在创建的表是否已存在于数据库中。 如果是这种情况,MySQL将忽略整个语句,不会创建任何新的表。 强烈建议在每个CREATE TABLE
语句中使用IF NOT EXISTS
来防止创建已存在的新表而产生错误。 -
其次,在
column_list
部分指定表的列表。字段的列用逗号(,
)分隔。我们将在下一节中向您展示如何更详细地列(字段)定义。 -
第三,需要为
engine
子句中的表指定存储引擎。可以使用任何存储引擎,如:InnoDB,MyISAM,HEAP,EXAMPLE,CSV,ARCHIVE,MERGE, FEDERATED或NDBCLUSTER。如果不明确声明存储引擎,MySQL将默认使用InnoDB。
-
-
注:InnoDB自MySQL 5.5之后成为默认存储引擎。 InnoDB表类型带来了诸如ACID事务,引用完整性和崩溃恢复等关系数据库管理系统的诸多好处。
在以前的版本中,MySQL使用MyISAM作为默认存储引擎。要在
CREATE TABLE
语句中为表定义列,请使用以下语法: -
column_name data_type[size] [NOT NULL|NULL] [DEFAULT value] [AUTO_INCREMENT]
以上语法中最重要的组成部分是:
column_name
指定列的名称。每列具有特定数据类型和大小,例如:VARCHAR(255)
。NOT NULL
或NULL
表示该列是否接受NULL
值。DEFAULT
值用于指定列的默认值。AUTO_INCREMENT
指示每当将新行插入到表中时,列的值会自动增加。每个表都有一个且只有一个AUTO_INCREMENT
列。
-
如果要将表的特定列设置为主键,则使用以下语法:
-
PRIMARY KEY (col1,col2,...)
示例:
- 可以使用
CREATE TABLE
语句创建这个tasks
表,如下所示: -
CREATE TABLE IF NOT EXISTS tasks ( task_id INT(11) NOT NULL AUTO_INCREMENT, subject VARCHAR(45) DEFAULT NULL, start_date DATE DEFAULT NULL, end_date DATE DEFAULT NULL, description VARCHAR(200) DEFAULT NULL, PRIMARY KEY (task_id) ) ENGINE=InnoDB;
-
四、MySQL 序列
-
在MySQL中,序列是以升序生成的整数列表,即
1
,2
,3
...
许多应用程序需要序列来生成主要用于识别的唯一数字,例如:CRM中的客户ID,HR中的员工编号,服务器管理系统的设备编号等。要自动在MySQL中创建序列,可以在列上设置
AUTO_INCREMENT
属性,这通常是主键列。使用
AUTO_INCREMENT
属性时,将应用以下规则: -
- 每个表只有一个
AUTO_INCREMENT
列,其数据类型通常为整数。 - 必须对
AUTO_INCREMENT
列进行索引,它可以是PRIMARY KEY或UNIQUE索引。 AUTO_INCREMENT
列必须具有NOT NULL约束。当您为列设置AUTO_INCREMENT
属性时,MySQL会自动将NOT NULL
约束隐式添加到列中。
- 每个表只有一个
- 示例:
- 以下语句创建一个名为
employees
的表,其emp_no
列为AUTO_INCREMENT
列: -
USE testdb; CREATE TABLE employees( emp_no INT(4) AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50) );
MySQL 如何工作
-
AUTO_INCREMENT
列具有以下属性:AUTO_INCREMENT
列的起始值为1
,当您向列中插入NULL值或在INSERT语句中省略其值时,它将增加1
。- 要获取最后生成的序列号,请使用LAST_INSERT_ID()函数。 我们经常要后续语句中使用最后一个插入ID,例如将数据插入到表中。 最后生成的序列在会话中是唯一的。 换句话说,如果另一个连接生成序列号,从连接中可以使用
LAST_INSERT_ID()
函数获取它。 - 如果将新行插入到表中并指定序列列的值,如果序列号不存在于列中,则MySQL将插入序列号,如果序列号已存在,则会发出错误。 如果插入大于下一个序列号的新值,MySQL将使用新值作为起始序列号,并生成大于当前值的唯一序列号。这会在序列中产生一段空白(不连续)。
-
如果使用UPDATE语句将
AUTO_INCREMENT
列中的值更新为已存在的值,如果该列具有唯一索引,则MySQL将发出重复键错误。 如果将AUTO_INCREMENT
列更新为大于列中现有值的值,MySQL将使用最后一个插入序列号加1
的值作为下一行列号值。 例如,如果最后一个插入序列号为3
,然后又将其更新为10
,那么新插入行的序列号不是11
,而是4
。 -
如果使用DELETE语句删除最后插入的行,MySQL可能会也可能不会根据表的存储引擎重复使用已删除的序列号。 如果您删除一行,则MyISAM表不会重复使用已删除的序列号,例如,如果删除表中的最后一个插入
ID
为10
,则MySQL仍会为新行生成11个下一个序列号。 与MyISAM表类似,InnoDB表在行被删除时不重复使用序列号。
在列上设置AUTO_INCREMENT属性后,可以以各种方式重置自动增量值,例如使用ALTER TABLE语句。
-
alter table 语句简介
- 可以使用
ALTER TABLE
语句来更改现有表的结构。ALTER TABLE
语句可用来添加列,删除列,更改列的数据类型,添加主键,重命名表等等。 以下说明了ALTER TABLE
语句语法: -
ALTER TABLE table_name action1[,action2,…]
要更改现有表的结构:
- 首先,在
ALTER TABLE
子句之后指定要更改的表名称。 - 其次,列出一组要应用于该表的操作。操作可以是添加新列,添加主键,重命名表等任何操作。
ALTER TABLE
语句允许在单个ALTER TABLE
语句中应用多个操作,每个操作由逗号(,
)分隔。 - 假设您希望在任务表中插入新行时,
task_id
列的值会自动增加1
。那么可以使用ALTER TABLE
语句将task_id
列的属性设置为AUTO_INCREMENT
,如下所示: -
alter table tasks change column task_id task_id INT(11) NOT NULL AUTO_INCREMENT;
使用MySQL ALTER TABLE语句将新的列添加到表中
由于新的业务需求,需要添加一个名为
complete
的新列,以便在任务表中存储每个任务的完成百分比。 在这种情况下,您可以使用ALTER TABLE
将新列添加到tasks
表中,如下所示: -
ALTER TABLE tasks ADD COLUMN complete DECIMAL(2,1) NULL AFTER description;
使用MySQL ALTER TABLE从表中删除列
假设您不想将任务的描述存储在
tasks
表中了,并且必须将其删除。 以下语句允许您删除tasks
表的description
列: -
ALTER TABLE tasks DROP COLUMN description
以下语句将
tasks
表重命名为work_items
表: -
ALTER TABLE tasks RENAME TO work_items;
-
七、重命名表
- rename table 语句简介
- 要更改一个或多个表,我们使用
RENAME TABLE
语句如下: -
rename talbe old_table_name to new_table_name;
旧表(
old_table_name
)必须存在,新表(new_table_name
)必须不存在。 如果新表new_table_name
存在,则该语句将失败。除了表之外,我们还可以使用
RENAME TABLE
语句来重命名视图。在执行
RENAME TABLE
语句之前,必须确保没有活动事务或锁定表。 -
请注意,不能使用RENAME TABLE语句来重命名临时表,但可以使用ALTER TABLE语句重命名临时表。
重命名多个表
-
RENAME TABLE old_table_name_1 TO new_table_name_2, old_table_name_2 TO new_table_name_2,...
示例:
- 以下语句将
people
和depts
重命名为employees
和departments
表: -
RENAME TABLE depts TO departments, people TO employees;
使用ALTER TABLE语句重命名表
- 我们可以使用
ALTER TABLE
语句重命名一个表,如下所示: -
ALTER TABLE old_table_name RENAME TO new_table_name;
- 首先,在