在像MySQL这样的关系型数据库中,数据表是数据库中最重要,最基本的操作对象,是数据存储的基本单位。下文简称为“表”
1. 查看数据库中的所有表,以及 表的创建 / 销毁 / 查看概要 / 查看详情 / 清空内容 / 改名
创建表以前,必须指定数据库,使用 use 数据库名;
create table 表名
(
字段名1 数据类型 列约束条件 默认值,
字段名2 数据类型 列约束条件 默认值,
字段名3 数据类型 列约束条件 默认值,
...
字段名N 数据类型 列约束条件 默认值,
[表级约束条件]
);
create database test_db; --创建数据库test_db
use test_db; --切换当前数据库为test_db
create table tb_emp1 --在test_db内创建表 tb_emp1
(
id INT(11),
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);
字段名称 | 数据类型 | 备注名称 |
id | INT(11) | 员工编号 |
name | VARCHAR(25) | 员工名称 |
deptId | INT(11) | 所在部门编号 |
salary | FLOAT | 工资 |
查看表的概要信息
desc tb_emp1;
等同于如下语句
describe tb_emp1;
查看表的详细信息(即创建信息,包括表中存在的所有约束)
show create table tb_emp1;
销毁表示例
use test_db;
drop table tb_emp1;
查看数据库中的所有表
use test_db;
show tables;
修改表名 (语法: alter table 原表名 rename 新表名;)
alter table tb_emp1 rename emp1_tb;
2. 使用主键约束
主键,又名主码,为表中一列或多列的组合。主键约束要求主键数据唯一,并且不为空。它能唯一地标识表中的一条记录,可以结合外键来定义不同表间的关系,并可以加快数据库查询的速度。主键分为单字段主键和多字段联合主键。
主键约束示例
create table tb_emp2(
id int(11) primary key,
name varchar(25),
deptId int(11),
salary float
);
或者
create table tb_emp2(
id int(11),
name varchar(25),
deptId int(11),
salary float,
constraint pk primary key(id) -- 此处的pk为约束名,可以自定义
);
多字段联合主键示例
create table tb_emp2(
id int(11),
name varchar(25),
deptId int(11),
salary float,
primary key(id, name, deptId)
);
或者
create table tb_emp2(
id int(11),
name varchar(25),
deptId int(11),
salary float,
constraint pk primary key(id, name, deptId) -- 此处的pk为约束名,可以自定义
);
3. 使用外键约束和非空约束
外键用来在两个表的数据间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中中主键的某个值。
外键:它是本表的一个字段,可以不是主键,但对应另一张表的主键。外键主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。删除主表以前,必须删除其所有从表(子表)或者 保留子表但要清除外键约束。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。单纯的从表(子表)的内容可以直接删除。
非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。
外键约束及非空约束示例
/* 创建一个部门表 */
create table tb_dept1(
id int(11) primary key,
name varchar(22) not null, -- not null为非空约束,禁止此字段的值为空
location varchar(50)
);
/* 创建一个员工表,并让员工表的部门ID字段作为外键关联到部门表的主键 */
create table tb_emp1(
id int(11) primary key,
name varchar(25) not null, --非空约束
deptId int(11),
salary float,
constraint fk_tb_dept1 foreign key(deptId) references tb_dept1(id)
);
4. 使用唯一性约束和默认约束
唯一性约束(Unique Constraint)要求该列的每个值是唯一的,允许为空,但只能存在一个空值。唯一性约束可以保证一列或者几列不出现重复值。语法为在定义列后直接指定唯一性约束。
默认约束为指定某列的默认值,例如,如果男性较多,那么,性别可以默认为'男'。
示例
/* 唯一性约束示例 */
create tb_dept7(
id int(11) primary key,
name varchar(25) unique, --唯一性约束,指定部门名称唯一,不存在重复
location varchar(50)
);
或者
create tb_dept7(
id int(11) primary key,
name varchar(25),
location varchar(50),
constraint uk unique(name) --uk可以自定义
);
/* 默认约束示例 */
create tb_emp7(
id int(11) primary key,
name varchar(25) not null,
deptId int(11) default 111, --默认部门ID为111
salary float
);
5. 修改数据表
修改字段数据类型,关键词为modify
desc tb_emp3;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | NO | PRI | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
alter table tb_emp3 modify name int(11); --将name的数据类型改为int
desc tb_emp3;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | int(11) | NO | PRI | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+---------+------+-----+---------+-------+
修改字段名,关键词为 change,语法为alter table 表名 旧的字段名 新的字段名 新的字段的数据类型,
不难从语法看出,change关键词同样支持修改字段的数据类型。
desc tb_dept3;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
将location改名为loc,并重新指定数据类型
alter table tb_dept3 change location loc varchar(50);
desc tb_dept3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| loc | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
将loc的数据类型利用change关键字改为int(11)
alter table tb_dept3 change loc loc int(11);
desc tb_dept3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| loc | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
添加字段
语法:
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST | AFTER 已存在字段]
示例
添加无完整性约束条件的字段
alter table tb_dept3 add managerId int(10);
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
添加有完整性约束条件的字段
alter table tb_dept3 add column1 varchar(12) not null;
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
在表的第一列添加一个字段
alter table tb_dept3 add column2 varchar(12) first;
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
在表的指定列后添加一个字段
alter table tb_dept3 add column3 int(11) after name; --在name后新增列column3
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
删除字段
语法:ALTER TABLE <表名> DROP <字段名>
示例:
先查看原表格概要
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
开始删除列
alter table tb_dept3 drop column1; --删除表中的列column1
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
修改字段的排列位置
对于一个数据表而言,在创建的时候,字段在表中的排序已经确定了。但表的结构并不是完全不可以改变的,可以通过ALTER TABLE来改变表中字段的相对位置,语法格式如下
ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>;
示例1, 修改字段为表的第一个
先查看原表
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
| column1 | int(11) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
接下来将column1移动为表的第一个字段
alter tb_dept3 modify column1 int(11) first;
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column1 | int(11) | YES | | NULL | |
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
示例2, 修改字段到表的指定列后
先查看原表
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column1 | int(11) | YES | | NULL | |
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
接下来将column1移动到location列后
alter table tb_dept3 modify column1 int(11) after location;
desc tb_dept3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | UNI | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(25) | YES | | NULL | |
| column1 | int(11) | YES | | NULL | |
| managerId | int(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
修改表的存储引擎
存储引擎是MySQL中的数据存储在文件或者内存中的不同技术实现,可以根据实际需求选择不同的引擎,甚至可以为每一张表选择不同的引擎。可以用show engines;查看系统支持的存储引擎。
更改引擎语法 ALTER TABLE <表名> ENGINE=<新引擎的名字>
示例
先查看本机支持的引擎
show engines;
InnoDB
MRG_MYISAM
MEMORY
BLACKHOLE
MyISAM
CSV
ARCHIVE
PERFORMANCE_SCHEMA
FEDERATED
查看表的创建信息
show create table tb_emp6;
| Table | Create Table |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp6 | CREATE TABLE `tb_emp6` (
`id` int(11) NOT NULL,
`name` varchar(25) NOT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
修改表的存储引擎(默认引擎为InnoDB)
alter table tb_emp6 engine=MyISAM;
再次查看表的创建信息
show create table tb_emp6;
| Table | Create Table |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp6 | CREATE TABLE `tb_emp6` (
`id` int(11) NOT NULL,
`name` varchar(25) NOT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
删除表的外键约束
语法:ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>
示例:
创建部门表
create table tb_dept1(
id int(11) primary key,
name varchar(25) not null,
location varchar(50)
);
创建带外键约束的员工表
create table tb_emp9(
id int(11) primary key,
name varchar(25) not null,
deptId int(11),
salary float,
constraint fk_deptId foreign key(deptId) references tb_dept1
);
查看员工表的详细信息
show create table tb_emp9;
删除外键约束
alter table tb_emp9 drop foreign keyfk_deptId;
再次查看被删除约束信息后的员工表
show create table tb_emp9;