mysql|MySQL基础篇(四)-- 数据表的基本操作

数据表是数据库的重要组成部分,每一个数据库都是由若干个数据表组成的。换句话说,没有数据表就无法在数据库中存放数据。
1 创建数据表 1.1 表创建基础
熟悉Excel的小伙伴肯定都知道,需要先新建工作簿,然后在该工作簿里新建表格,相似的过程,创建数据库后,并在该数据库中创建数据表。
可使用SQL的CREATE TABLE语句创建表,必须给出以下信息:

  • 新表的名字,在关键字CREATE TABLE之后给出;
  • 表列的名字和定义,用逗号分隔。
语法格式如下:
create table 表名( 字段名1 类型[(宽度)] [约束条件] [comment '字段说明'], 字段名2 类型[(宽度)] [约束条件] [comment '字段说明'], 字段名3 类型[(宽度)] [约束条件] [comment '字段说明'] )[表的一些设置];

CREATE TABLE 语句的主要语法及使用说明如下:
  • CREATE TABLE:用于创建给定名称的表,必须拥有表CREATE的权限。
  • <表名>:指定要创建表的名称,在 CREATE TABLE 之后给出,必须符合标识符命名规则。表名称被指定为 db_name.tbl_name,以便在特定的数据库中创建表。无论是否有当前数据库,都可以通过这种方式创建。在当前数据库中创建表时,可以省略 db-name。如果使用加引号的识别名,则应对数据库和表名称分别加引号。例如,‘mydb’.‘mytbl’ 是合法的,但 ‘mydb.mytbl’ 不合法。
  • <表定义选项>:表创建定义,由列名(col_name)、列的定义(column_definition)以及可能的空值说明、完整性约束或表索引组成。
  • 默认的情况是,表被创建到当前的数据库中。若表已存在、没有当前数据库或者数据库不存在,则会出现错误。
温馨提示:
  • 要创建的表的名称不区分大小写,不能使用SQL语言中的关键字,如DROP、ALTER、INSERT等。宽度和约束条件为可选参数,字段名和类型是必须的。每列的定义以列名(字段名,它在表中必须是唯一的)开始,后跟列的数据类型。各列之间用逗号分隔。
  • 在创建新表时,指定的表名必须不存在,否则将出错。如果要防止意外覆盖已有的表,SQL要求首先手工删除该表(请参阅后面的小节),然后再重建它,而不是简单地用创建表语句覆盖它。如果你仅想在一个表不存在时创建它,应该在表名后给出IF NOT EXISTS。这样做不检查已有表的模式是否与你打算创建的表模式相匹配。它只是查看表名是否存在,并且仅在表名不存在时创建它。
1.2 使用NULL值
允许NULL值的列也允许在插入行时不给出该列的值。不允许NULL值的列不接受该列没有值的行,换句话说,在插入或更新行时,该列必须有值。
每个表列或者是NULL列,或者是NOT NULL列,这种状态在创建时由表的定义规定。请看下面的例子:
mysql|MySQL基础篇(四)-- 数据表的基本操作
文章图片
温馨提示: 不要把NULL值与空串相混淆。NULL值是没有值,它不是空串。如果指定’'(两个单引号,其间没有字符),这在NOT NULL列中是允许的。空串是一个有效的值,它不是无值。NULL值用关键字NULL而不是空串指定。
1.3 主键和外键
主键值必须唯一。即,表中的每个行必须具有唯一的主键值。如果主键使用单个列,则它的值必须唯一。如果使用多个列,则这些列的组合值必须唯一。
primary key:标识该字段为该表的主键,可以唯一的标识记录,插入重复的会报错。
  • 方式1:跟在列后,如下:
    mysql|MySQL基础篇(四)-- 数据表的基本操作
    文章图片

  • 方式2:在所有列定义之后定义,如下:
    mysql|MySQL基础篇(四)-- 数据表的基本操作
    文章图片

  • 方式3:支持多字段作为主键,多个之间用逗号隔开,语法:`primary key(字段1, 字段2, 字段n),示例:
    mysql|MySQL基础篇(四)-- 数据表的基本操作
    文章图片

  • 方式4:为表中的字段设置外键
    语法:foreign key(当前表的列名) references 引用的外键表(外键表中字段名称)
    mysql|MySQL基础篇(四)-- 数据表的基本操作
    文章图片

注意一下几点:
  • 两张表中需要建立外键关系的字段类型需要一致
  • 要设置外键的字段不能为主键
  • 被引用的字段需要为主键
  • 被插入的值在外键表必须存在,如上面向test10中插入ts9_a为2的时候报错了,原因:2的值在test9表中不存在
**温馨提示:**主键为其值唯一标识表中每个行的列。主键中只能使用不允许NULL值的列。允许NULL值的列不能作为唯一标识。每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(如,通过使它成为主键)。
unique key(uq):标识该字段的值是唯一的。支持一个到多个字段,插入重复的值会报违反唯一约束,会插入失败。
  • 方式1:跟在字段后,如下所示:
    mysql|MySQL基础篇(四)-- 数据表的基本操作
    文章图片

  • 方式2:所有列定义之后定义,如下:
    mysql|MySQL基础篇(四)-- 数据表的基本操作
    文章图片

  • 方式3:支持多字段,多个之间用逗号隔开,语法:unique key(字段1,字段2,字段n),示例:
    mysql|MySQL基础篇(四)-- 数据表的基本操作
    文章图片

1.4 使用AUTO_INCREMENT
AUTO_INCREMENT告诉MySQL,本列每当增加一行时自动增量。每次执行一个INSERT操作时,MySQL自动对该列增量(从而才有这个关键字AUTO_INCREMENT),给该列赋予下一个可用的值。
mysql|MySQL基础篇(四)-- 数据表的基本操作
文章图片
温馨提示: 关于自动增长字段的初始值、步长可以在mysql中进行设置,比如设置初始值为1万,每次增长10。自增长列当前值存储在内存中,数据库每次重启之后,会查询当前表中自增列的最大值作为当前值,如果表数据被清空之后,数据库重启了,自增列的值将从初始值开始。
1.5 指定默认值
如果在插入行时没有给出值,MySQL允许指定此时使用的默认值。默认值用CREATE TABLE语句的列定义中的DEFAULT关键字指定。
mysql|MySQL基础篇(四)-- 数据表的基本操作
文章图片

温馨提示: 与大多数DBMS不一样,MySQL不允许使用函数作为默认值,它只支持常量。
1.6 引擎类型
在创建表格时,常用的就是ENGINE=InnoDB;与其他DBMS一样,MySQL有一个具体管理和处理数据的内部引擎。在你使用CREATE TABLE语句时,该引擎具体创建表,而在你使用SELECT语句或进行其他数据库处理时,该引擎在内部处理你的请求。多数时候,此引擎都隐藏在DBMS内,不需要过多关注它。
如果省略ENGINE=语句,则使用默认引擎(很可能是MyISAM),多数SQL语句都会默认使用它。但并不是所有语句都默认使用它,这就是为什么ENGINE=语句很重要的原因。
常用的引擎:
  • InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索;
  • MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘)
    中,速度很快(特别适合于临时表);
  • MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理。
温馨提示: 混用引擎类型有一个大缺陷。外键(用于强制实施引用完整性)不能跨引擎,即使用一个引擎的表不能引用具有使用不同引擎的表的外键。
2 修改数据表 修改数据表的前提是数据库中已经存在该表。修改表指的是修改数据库中已经存在的数据表的结构。
2.1 修改表名
MySQL 通过 ALTER TABLE 语句来实现表名的修改,语法规则如下:
ALTER TABLE <旧表名> RENAME [TO] <新表名>;

其中,TO 为可选参数,使用与否均不影响结果。
温馨提示: 使用ALTER TABLE要极为小心,应该在进行改动前做一个完整的备份(模式和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,可能不能删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。
2.2 修改表字符集
MySQL 通过 ALTER TABLE 语句来实现表字符集的修改,语法规则如下:
ALTER TABLE 表名 [DEFAULT] CHARACTER SET <字符集名> [DEFAULT] COLLATE <校对规则名>;

其中,DEFAULT 为可选参数,使用与否均不影响结果。
3 修改字段 3.1 修改字段名称
MySQL 中修改表字段名的语法规则如下:
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;

说明:
  • 旧字段名:指修改前的字段名;
  • 新字段名:指修改后的字段名;
  • 新数据类型:指修改后的数据类型,如果不需要修改字段的数据类型,- 可以将新数据类型设置成与原来一样,但数据类型不能为空。
温馨提示: 由于不同类型的数据在机器中的存储方式及长度并不相同,修改数据类型可能会影响数据表中已有的数据记录,因此,当数据表中已经有数据时,不要轻易修改数据类型。
3.2 修改字段数据类型
修改字段的数据类型就是把字段的数据类型转换成另一种数据类型。在 MySQL 中修改字段数据类型的语法规则如下:
ALTER TABLE <表名> MODIFY <字段名> <数据类型>

说明:
  • 表名:指要修改数据类型的字段所在表的名称;
  • 字段名:指需要修改的字段;
  • 数据类型:指修改后字段的新数据类型。
3.3 删除字段
删除字段是将数据表中的某个字段从表中移除,语法格式如下:
ALTER TABLE <表名> DROP <字段名>;

其中,“字段名”指需要从表中删除的字段的名称。
4 删除数据表 在删除表的同时,表的结构和表中所有的数据都会被删除,因此在删除数据表之前最好先备份,以免造成无法挽回的损失。删除表(删除整个表而不是其内容)非常简单,使用DROP TABLE语句即可:
drop table tb_test;

温馨提示: 用户必须拥有执行DROP TABLE命令的权限,否则数据表不会被删除。表被删除时,用户在该表上的权限不会自动删除。
5 删除被其他表关联的主表 数据表之间经常存在外键关联的情况,这时如果直接删除父表,会破坏数据表的完整性,也会删除失败。
删除父表有以下两种方法:
  • 先删除与它关联的子表,再删除父表;但是这样会同时删除两个表中的数据。
  • 将关联表的外键约束取消,再删除父表;适用于需要保留子表的数据,只删除父表的情况。
mysql|MySQL基础篇(四)-- 数据表的基本操作
文章图片
6 查看表结构命令 6.1 以表格的形式展示表结构
DESCRIBE/DESC 语句会以表格的形式来展示表的字段信息,包括字段名、字段数据类型、是否为主键、是否有默认值等,语法格式如下:
describe\desc <表名>;

6.2 以SQL语句的形式展示表结构
SHOW CREATE TABLE 命令会以 SQL 语句的形式来展示表信息。和 DESCRIBE 相比,SHOW CREATE TABLE 展示的内容更加丰富,它可以查看表的存储引擎和字符编码;另外,你还可以通过\g或者\G参数来控制展示格式。
SHOW CREATE TABLE的语法格式如下:
SHOW CREATE TABLE <表名>;

在 SHOW CREATE TABLE 语句的结尾处(分号前面)添加\g或者\G参数可以改变展示形式。
7 数据表添加字段 MySQL 数据表是由行和列构成的,通常把表的“列”称为字段(Field),把表的“行”称为记录(Record)。随着业务的变化,可能需要在已有的表中添加新的字段。MySQL 允许在开头、中间和结尾处添加字段。
一个完整的字段包括字段名、数据类型和约束条件。MySQL 添加字段的语法格式如下:
ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件];

这种语法格式默认在表的最后位置(最后一列的后面)添加新字段。
7.1 在开头添加字段
MySQL 默认在表的最后位置添加新字段,如果希望在开头位置(第一列的前面)添加新字段,那么可以使用 FIRST 关键字,语法格式如下:
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] FIRST;

7.2 在中间位置添加字段
MySQL 除了允许在表的开头位置和末尾位置添加字段外,还允许在中间位置(指定的字段之后)添加字段,此时需要使用 AFTER 关键字,语法格式如下:
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] AFTER <已经存在的字段名>;

**温馨提示:**AFTER 的作用是将新字段添加到某个已有字段后面。只能在某个已有字段的后面添加新字段,不能在它的前面添加新字段。
8 复制表 8.1 只复制表结构
【mysql|MySQL基础篇(四)-- 数据表的基本操作】语法格式如下:
create table 表名 like 被复制的表名;

mysql|MySQL基础篇(四)-- 数据表的基本操作
文章图片
8.2 复制表结构+数据
create table 表名 [as] select 字段,... from 被复制的表 [where 条件];

mysql|MySQL基础篇(四)-- 数据表的基本操作
文章图片

    推荐阅读