在上一篇文章里,主要记录了数据库的一些操作,主要包括创建、查询、修改、删除等操作。
这一篇的内容则是围绕着数据库中的表进行展开,嘿嘿,其实这些内容是应该放在一篇来写的,但是。。。我懒啊。又不愿意写一半留着下次续写,所以只能分着写啦。见谅!
1.数据表特性
在MySQL中,数据表是以二维表格形式展示,一行代表一条完整数据,一列代表一种特定属性。
2.创建数据表
2.1.创建空数据表
- 语法
CREATE TABLE [IF NOT EXISTS] 表名(
字段1,数据类型,[约束条件][默认值],
字段2,数据类型,[约束条件][默认值],
)
- 创建一个包含序号、姓名和年龄的数据表
mysql> use test_new;
mysql> create table test_01 (
-> id int,
-> name varchar(20),
-> age varchar(30)
-> );
Query OK, 0 rows affected (0.07 sec)
注意:
在MySQL 8.0中,不再推荐为INT类型指定显示长度
如需要表名称不区分大小写,需要在my.cnf中添加以下配置:
lower_case_table_names=1
- 查看数据表,可以看到刚创建的数据表
mysql> show tables;
+--------------------+
| Tables_in_test_new |
+--------------------+
| test_01 |
+--------------------+
1 row in set (0.01 sec)
2.2.创建数据表时指定主键
主键又称作主码,在表中包含一列或多列,能够唯一标识表中的一行记录。
主键列的数据必须唯一,且不为空。
主键可分为单列主键和多列联合主键。
-
单列主键
单列主键只包含数据表中一个字段
语法:
字段 数据类型 PRIMARY KEY [默认值]
- 创建test_02数据表,将id字段作为主键
#定义列的同时指定主键
mysql> create table test_02 (
-> id int primary key,
-> name varchar(20),
-> age varchar(20)
-> );
Query OK, 0 rows affected (0.05 sec)
#也可以定义完所有列后指定主键
mysql> create table test_03 (
-> id int,
-> name varchar(20),
-> age varchar(20),
-> primary key(id)
-> );
Query OK, 0 rows affected (0.05 sec)
-
多列联合主键
多列联合主键只能在定义完表所有列后指定
语法:
PRIMARY KEY [字段1],[字段2],...[字段n]
用法与定义完所有列后指定主键相似,就不举例了。
2.3.创建数据表时指定外键
外键可以关联数据库的两张表
一张表的外键可以为空,也可以不为空,当外键不为空时,则外键的值必须对应另一张表主键某个值
一张表的外键可以不是本表主键,但是一定对应另一表主键
一张表定义了外键后不允许删除另一表具有关联关系的数据行
由外键引出两个概念,主表和从表
两表具有关联关系时,关联字段中主键所在的表为主表,外键所在的表为从表
- 创建外键的语法格式
[CONSTRAINT 外键名] FOREIGN KEY 字段1 REFERENCES 主表名 主键列1
#以上内容含义
外键名:定义外键时数据表指定的外键名称。同一表中,外键名唯一
FOREIGN KEY:外键包含哪些字段
REFERENCES:指定关联的主表名
将其加到创建的表字段后
2.4.创建数据表时指定字段非空
- 语法格式:
字段名称 数据类型 NOT NULL
- 创建一个例子可以直观体现出来
mysql> create table test_04 (
-> id int primary key not null,
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.02 sec)
2.5.创建表时指定默认值
- 语法格式
字段名称 数据类型 DEFAULT 默认值
- 例
mysql> create table test_05 (
-> id int default 1,
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.02 sec)
#当向表中插入数据时,没有指定id的值,则id字段的默认值为1
2.6. 创建数据表时指定主键默认递增
MySQL支持将整数类型主键设置为默认递增类型
这样向表中插入数据时,不用指定整数类型主键的值
MySQL会将该表整数类型的主键值自动加 1
- 语法格式
字段名称 数据类型 AUTO_INCREMENT
- 例
mysql> create table test_06 (
-> id int primary key auto_increment,
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.03 sec)
此时表中主键id为自动递增类型。在向表中插入数据时,
主键id默认值从1开始每加入一条新数据,id字段的值会自动加1.
2.7.创建数据表时指定存储引擎
- 语法格式
ENGINE=存储引擎名称
创建表时在语句后加入'ENGINE=存储引擎‘即可为当前表指定存储引擎
- 例
mysql> create table test_07 ( id int primary key auto_increment, name varchar(20) not null )engine=InnoDB;
Query OK, 0 rows affected (0.03 sec)
2.8.创建数据库时指定编码
- 语法格式
DEFAULT CHARACTER SET 编码 COLLATE 校对规则
或
DEFAULT CHARSET=编码 COLLATE=校对规则
- 和2.7一样,加在表后就可以了,就不举例了
3.查看数据表结构
3.1.使用DESCRIBE/DESC查看表结构
使用此语句查看表结信息,包含字段名称、数据类型及主键等信息
- 语法格式
DESCRIBE/DESC 表名称
- 例
mysql> desc test_06;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
以上信息说明:
Field:表中的字段
Type:字段中的数据类型
Null:表中当前字段能否为空
key:表中字段是否存在索引。PRI表示主键列,UNI表示当前列是UNIQUE标识的唯一索引列,或是其中一部分;MUL表示在当前列中某个值可以出现几次
Default:当前列是否由默认值,同时显示默认值是多少
Extra:表示与当前列相关的附件信息
3.2.使用SHOW CREATE TABLE语句查看表结构
通过这种方式,不仅可以查看创建表的SQL语句,
还可以看存储引擎和字符集等信息
- 语法格式:
SHOW CREATE TABLE 表名 \G
- 例
mysql> show create table test_06 \G
*************************** 1. row ***************************
Table: test_06
Create Table: CREATE TABLE `test_06` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
4.修改数据表
4.1.修改数据表名称
- 语法格式:
ALTER TABLE 原表名 RENAME [TO] 新表名
#TO可以省略
- 例
mysql> alter table test_06 rename to test_60;
Query OK, 0 rows affected (0.03 sec)
4.2.为数据表添加新字段
- 语法格式:
ALTER TABLE 表名 ADD COLUMN 新字段名 数据类型 [NOT NULL DEFAULT 默认值]
- 例,为表test_60添加新字段
mysql> alter table test_60 add column age varchar(20);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 添加字段时指定位置,在表的第一列添加字段
ALTER TABLE 表名 ADD COLUMN 新字段名 数据类型 [NOT NULL DEFAULT 默认值] FIRST
#FIRST关键字表示要添加的字段位于当前表的第一列
- 在指定字段后添加新字段
ALTER TABLE 表名 ADD COLUMN 新字段名 数据类型 [NOT NULL DEFAULT 默认值] ALTER 原有字段名
4.3.修改字段名称
- 语法格式
ALTER TABLE 表名 CHANGE 原字段名 新字段名 新数据类型
在修改字段名时也可以不修改数据类型
可以将新字段的数据类型设置成与原由字段数据类型一样
但是新字段名称的数据类型不能为空。
新字段名称后加上DEFAULT即为保持数据类型不变
4.4.修改字段的数据类型
- 语法格式
ALTER TABLE 表名 MODIFY 字段名 新数据类型 [DEFAULT 默认值]
使用MODIFY关键字指定字段的新数据类型
- 例
mysql> alter table test_60 modify age tinyint(2);
Query OK, 0 rows affected, 1 warning (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 1
咳咳,举例暂时忽略警告
4.5.修改字段位置
- 将字段的位置修改为数据表的第一个字段
ALTER TABLE 表名 MIDIFY 字段名 数据类型 FIRST
使用FIRST关键字将当前字段修改为数据表的第一个字段
- 将选中字段修改到某字段之后
ALTER TABLE 表名 MODIFY 字段1名称 字段1数据类型 AFTER 字段2名称
4.6.删除字段
- 删除表中某个字段的语法:
ALTER TABLE 表名 DROP 字段名
- 例
mysql> desc test_60;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| age | tinyint | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> alter table test_60 drop age;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
4.7.修改已有表的存储引擎
- 语法格式:
ALTER TABLE 表名 ENGINE=存储引擎名称
- 例
mysql> alter table test_05 engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
4.8.取消数据表的外键约束
- 语法格式:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名
5.删除数据表
5.1.删除没有关联关系的数据表
- 语法格式:
DROP TABLE [IF EXISTS] 数据表
- 例
mysql> drop table test_07;
Query OK, 0 rows affected (0.03 sec)
5.2.删除有外键约束的主表
- 可以先删除有外键约束从表,在删除主表
- 先解除外键约束,再删除主表
6.临时表
6.1.创建临时表
- 语法格式:
CREATE TEMPORARY TABLE [IF NOT EXISTS] 表名
注:临时表通过DESC或者SHOW CREATE TABLE语句来查看
6.2.删除临时表
- 语法格式
DROP TABLE [IF EXISTS] 表名
#与正常表删除方式一样
本文写了数据表的一些操作,当然,有很多地方只给出了语法,没有示例,因为数据表大的主体时相同的,不同的只是使用关键词上,所有只给出了语法,将语法代入即可。