在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。
创建数据表
所谓创建数据表,指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程。
数据表属于数据库,在创建数据表之前,应该使用语句USE <数据库名>
指定操作的是在哪一个数据库中进行,如果没有选择数据库,就会抛出”No database selected”的错误。
创建数据表的语句为CREATE TABLE
,语法规则如下:
CREATE TABLE <表名>
(
列名1,数据类型 [列级别约束条件] [默认值],
列名2,数据类型 [列级别约束条件] [默认值],
……
[表级别约束条件]
);
使用CREATE TABLE
创建表时,必须指定以下信息:
- 要创建的表的名称,不区分大小写,不能使用SQL语言中的关键字,如 DROP、ALTER、INSERT等
- 数据表中的每一个列(字段)的名称和数据类型。如果创建多个列,就要用逗号隔开。
例如:
- 1.创建数据库 - teaphy
mysql> CREATE DATABASE teaphy
-> ;
Query OK, 1 row affected (0.18 sec)
- 2.选择创建表的数据库 - teaphy
mysql> USE teaphy
Database changed
- 3.创建表
mysql> CREATE TABLE teaphy_emp1
-> (
-> id INT(11),
-> name VARCHAR(25),
-> depid INT(11),
-> salary FLOAT
-> );
- 4 使用
HOW TABLES;
命令查看数据表是否创建成功
mysql> SHOW TABLES;
+------------------+
| Tables_in_teaphy |
+------------------+
| teaphy_emp1 |
+------------------+
1 row in set (0.02 sec)
可以看到,teaphy数据库中已经有了数据表teaphy_emp1,数据表创建成功。
使用主键约束
主键又称为主码,是表中一列或多列的组合。主键约束(Primary Key Contraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。主键和记录之间的关系如同身份证和人的关系,它们之间是一一对应的。
主键分为两种类型:单字段主键和多字段联合主键。
单字段主键
主键由一个字段组成。
SQL语句格式分为两种情况:
在定义列的同时指定主键,语法规则为:
字段名 数据类型 PRIMARY KEY [默认值]
例如:
mysql> CREATE TABLE teaphy_emp2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> depid INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.53 sec)
在创建的teaphy_emp2表中,其主键为 id
2. 在定义完所有列之后指定主键,语法规则为:[CONSTRAINT <约束名> PRIMARY KEY [字段名]]
。
例如:
mysql> CREATE TABLE teaphy_emp3
-> (
-> id INT(11),
-> name VARCHAR(25),
-> depid INT(11),
-> salary FLOAT,
-> CONSTRAINT teaphy_emp3_pri PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.43 sec)
创建了数据表teaphy_emp3,在所有列声明以后,指定id为主键,其约束名为teaphy_emp3_pri.
多字段联合主键
主键由多个字段联合组成,其语法规则为:`PRIMARY KEY [字段1, 字段2,…, 字段n]
例如:
mysql> CREATE TABLE teaphy_emp4
-> (
-> name VARCHAR(25),
-> depid INT(11),
-> salary FLOAT,
-> PRIMARY KEY(name, depid)
-> );
Query OK, 0 rows affected (0.76 sec)
语句执行结束以后,创建了新表teaphy_emp4,其中,name
字段和depid
字段组合一起成为teaphy_emp4的多字段联合主键。
使用外键约束
外键用来在两个表的数据之间建立链接,可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须为另个表中的主键的某个值。
外键首先是表中的一个字段,可以不是本表的主键,但要对应另外一个表中的主键。外键的主要作用是保证数据的完整性,定义外键后,不允许删除在另外一个表中具有关联关系的行。
- 主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表。
- 从表(字表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表。
创建外键的语法规则:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [ ,字段名2,…]
REFERENCES <主表名> 主键列1 [ ,主键列2,…]
其中:
- 外键名:定义外键约束的名称,一个表中不能有相同名称的外键
- 字段名:表示子表需要添加外键约束的字段列
- 主表名:表示被子表外键所依赖的表的名称
- 主键列:表示主表中定义的主键列或者列组合
例如:
- 1.创建主表 - teaphy_dept1,其主键为
id
mysql> CREATE TABLE teaphy_dept1
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> location VARCHAR(60)
-> );
Query OK, 0 rows affected (0.54 sec)
- 2.创建子表 - teaphy_dept2
mysql> CREATE TABLE teaphy_dept2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> depId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_ept_dept1 FOREIGN KEY(depId) REFERENCES teaphy_dept1(id)
-> );
Query OK, 0 rows affected (0.84 sec)
在表teaphy_dept2中,添加了名为fk_ept_dept1
的外键约束,外键名称为depId
,其依赖于表teaphy_dept1的主键id
使用非空约束
非空约束(Not Null constraint)指字段的值不能为空。对于使用了非空约束的字段如果用户在添加数据时,没有指定值,数据库系统会报错。
非空约束的语法规则:字段名 数据类型 not null
例如:
mysql> CREATE TABLE teaphy_emp5
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25) NOT NULL,
-> age INT(3)
-> );
Query OK, 0 rows affected (0.41 sec)
执行该SQL语句后,创建表teaphy_emp5,其中字段name
的插入值不能为空(NOT NULL).
使用唯一性约束
唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。
唯一性约束的语法规则如下:
- 在定义完列之后直接指定唯一约束,语法规则为:
字段名 数据类型 UNIQUE
例如:
mysql> CREATE TABLE teaphy_emp6
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25) UNIQUE,
-> age INT(11)
-> );
Query OK, 0 rows affected (0.84 sec)
执行该SQL语句后,创建表teaphy_emp6,指定字段name
唯一。
2. 在定义完所有列之后,指定唯一约束,语法规则为:[CONSTRAINT <约束名>] UNIQUE 字段名
例如:
mysql> CREATE TABLE teaphy_emp7
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> age INT(3),
-> CONSTRAINT u_name UNIQUE(name)
-> );
Query OK, 0 rows affected (0.44 sec)
执行该SQL语句后,创建表teaphy_emp7,指定字段name
唯一,并且指定唯一约束的名称为u_name
。
UNIQUE
和PRIMARY KEY
的区别:
- 一个表中可以有多个字段声明为
UNIQUE
,但是只能有一个PRIMARY KEY
声明 - 声明为
PRIMARY KEY
的列不允许有空值,但是声明UNIQUE
的字段允许控制(NULL)存在
使用默认约束
默认约束(Default Constraint)指定某列的默认值。例如,成年人的年龄认定为大于等于18.如果插入一条记录时没有为age
这个字段赋值,那么系统会自动为这个字段赋值为18.
默认约束的语法规则:字段名 数据类型 DEFAULT 默认值
例如:
mysql> CREATE TABLE teaphy_emp8
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> age INT(3) DEFAULT 18
-> );
Query OK, 0 rows affected (0.56 sec)
执行该SQL语句后,创建表teaphy_emp8,其中字段age
拥有了默认值18,新插入的记录,如果没有指定年龄,则默认为18.
设置表的属性值自动增加
在数据库应用中,经常希望在每次插入新记录时,系统就会自动生成字段的主键值。可以通过为表主键添加AUTO_INCREMENT关键字来实现。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLINT、INT、BIGINT等)。
设置表的属性值自动增加的语法规则:字段名 数据类型 AUTO_INCREMENT
例如:
mysql> CREATE TABLE teaphy_emp9
-> (
-> id INT(11) PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(25),
-> age INT(3)
-> );
Query OK, 0 rows affected (0.55 sec)
执行该SQL语句后,创建表teaphy_emp9,其主键id
字段的值在添加新记录时会自动增加,在插入记录时,默认的自增字段id
从1开始,每次添加一条新记录,该值自动加1.
查看数据表结构
使用SQL语句创建好数据表以后,可以查看表结构的定义,以确保表的定义是否正确。在MySql中,查看表结构使用DESCRIBE
和SHOW CREATE TABLE
语句。
DESCRIBE/DESC
DESCRIBE/DESC语句可以查看表的字段信息,其中包括:字段名、字段数据类型、是否为主键、是否有默认值等。
DESCRIBE/DESC的语法规则
DESCRIBE <表名>
DESC <表名>
例如:
- 1.使用
DESCRIBE
命令查看表teaphy_emp1
mysql> DESCRIBE teaphy_emp1;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
DESC
命令查看表teaphy_emp1
mysql> DESC teaphy_emp1;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
其中,各个字段的含义如下:
- Field:表示字段名称
- Type:表示字段类型
- Null:表示该列是否可以存储NULL值
Key:表示该列是否已编制索引。
- PRI:表示该列时表主键的一部分
- UNI:表示该列是UNIQUE索引的一部分
- MUL:表示在列中某个给定的值允许重复出现多次
- Default:表示该列是否有默认值,如有的话,值是多少
- Extra:表示可以获取的与给定列有关的附加信息。
查看表详细结构语句SHOW CREATE TABLE
SHOW CREATE TABLE
语句可以用来显示数据表的创建语句。语法格式为:SHOW CREATE TABLE <表名\G>
- 使用
SHOW CREATE TABLE
语句,不仅可以查看数据表的创建语句,还可以查看存储引擎和字符编码- 如果不加
\G
参数,那么显示的结果可能非常混乱;加上参数\G
之后,可使结果显示的更加直观。
例如:
mysql> SHOW CREATE TABLE teaphy_emp1 \G;
*************************** 1. row ***************************
Table: teaphy_emp1
Create Table: CREATE TABLE `teaphy_emp1` (
`id` int(11) DEFAULT NULL,
`name` varchar(25) DEFAULT NULL,
`depid` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
ERROR:
No query specified
修改数据表
修改数据表指的是修改数据库中,已经存在的数据表的结构。MySQL使用ALTER TABLE
语句修改数据表。常用的操作有修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置,更改表的存储引擎,删除表的外键约束等。
修改表名
MySQL是通过ALTER TABLE
语句来实现表名的修改的。语法规则为:ALTER TABLE <旧表名> RENAME [TO] <新表名>;
例如:
mysql> ALTER TABLE teaphy_emp1 RENAME teaphy_alter1;
Query OK, 0 rows affected (0.40 sec)
执行SQL语句,将表teaphy_emp1
改名为teaphy_alter1
.
修改字段的数据类型
修改字段的数据类型,就是把字段的数据类型转换成另一种数据类型。
语法规则为:ALTER TABLE <表名> MODIFY <字段名> <数据类型>
例如:
- 1.使用
DESC
查看表teaphy_emp2的表结构:
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
语句,将name的数据类型由VARCHAR(25)修改为VARCHAR(40)
mysql> ALTER TABLE teaphy_emp2 MODIFY name VARCHAR(40);
Query OK, 0 rows affected (0.23 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.再次使用使用
DESC
查看表teaphy_emp2的表结构
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(40) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.02 sec)
这时,可以清楚地看到teaphy_emp2中的name字段的数据类型已经修改为VARCHAR(40)
修改字段名称
MySQL中修改表字段名的语法规则如下:ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
其中:
- 旧字段名:指修改前的字段名
- 新字段名:指修改后的字段名
- 新数据类型:指修改后的字段名的数据类型。如果需要修改字段的数据类型,将新数据类型设置成与原来一样即可,但数据类型不能为空。
例如:
- 1.使用
DESC
查看表teaphy_emp2的表结构:
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(40) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
语句将name
修改为n_name
,并且将数据类型修改为 VARCHAR(25)
mysql> ALTER TABLE teaphy_emp2 CHANGE name n_name VARCHAR(25);
Query OK, 0 rows affected (1.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.使用
DESC
查看表teaphy_emp2的表结构:
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| n_name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
CHANGE
也可以只修改数据类型,实现MODIFY
同样的效果,方法是将SQL语句中的‘新字段名’和‘旧字段名’设置为相同的名称,只改变‘数据类型’。
由于不同的数据类型的数据在机器中存储的方式及长度并不相同,修改数据类型可能会影响到数据表中已有数据记录,因此当数据表已经有数据时,不要轻易修改数据类型。
添加字段
一个完整的字段包括字段名、数据类型、完整性约束。在已经存在的表添加新的完整字段的语法规则为:ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST | AFTER 已存在字段名];
其中:
- 新字段名:指需要添加的字段名称
FIRST
或AFTER 已存在字段名
用于指定新增字段在表中的位置。如果SQL语句中没有这两个参数,就默认将新添加的字段设置为数据表的最后列。
添加无完整性约束条件的字段
- 1.使用
DESC
命令查看teaphy_emp3
的表结构
mysql> DESC teaphy_emp3;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
语句添加无完整性约束条件的字段column0
mysql> ALTER TABLE teaphy_emp3 ADD column0 INT(10);
Query OK, 0 rows affected (0.82 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.使用
DESC
命令查看teaphy_emp3
的表结构
mysql> DESC teaphy_emp3;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
| column0 | int(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
添加有完整性约束条件的字段
- 1.使用
ALTER TABLE
语句添加不能为空的字段column1
mysql> ALTER TABLE teaphy_emp3 ADD column1 INT(10) NOT NULL;
Query OK, 0 rows affected (1.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 2.使用
DESC
命令查看teaphy_emp3
的表结构
mysql> DESC teaphy_emp3;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
| column0 | int(10) | YES | | NULL | |
| column1 | int(10) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
在表的第一列添加一个字段
- 1.使用
ALTER TABLE
语句在添加字段column2
mysql> ALTER TABLE teaphy_emp3 ADD column2 INT(10) FIRST;
Query OK, 0 rows affected (0.94 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 2.使用
DESC
命令查看teaphy_emp3
的表结构
mysql> DESC teaphy_emp3;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | int(10) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
| column0 | int(10) | YES | | NULL | |
| column1 | int(10) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
此时发现,在表teaphy_emp3第一列添加了字段column2。
在表的指定位置添加一个字段
- 1.使用
ALTER TABLE
语句在添加字段column3
mysql> ALTER TABLE teaphy_emp3 ADD column3 INT(10) AFTER name;
Query OK, 0 rows affected (0.94 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 2.使用
DESC
命令查看teaphy_emp3
的表结构
mysql> DESC teaphy_emp3;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | int(10) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| column3 | int(10) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
| column0 | int(10) | YES | | NULL | |
| column1 | int(10) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
此时发现,在表teaphy_emp中,在namelie后面添加字段column3
删除字段
删除字段是将数据表中的某个字段从表中移除。语法格式为:ALTER TABLE <表名> DROP <字段名>;
- 1.使用
DESC
命令查看teaphy_emp4
的表结构
mysql> DESC teaphy_emp4;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(25) | NO | PRI | NULL | |
| depid | int(11) | NO | PRI | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
删除字段salary
mysql> ALTER TABLE teaphy_emp4 DROP salary;
Query OK, 0 rows affected (1.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.使用
DESC
命令查看teaphy_emp4
的表结构
mysql> DESC teaphy_emp4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(25) | NO | PRI | NULL | |
| depid | int(11) | NO | PRI | NULL | |
+-------+-------------+------
修改字段的排列位置
对于一个数据表来说,在创建的时候,字段在表中的排列顺序已经确定了。但是,表的结构并不是完全不可以改变的,可以通过ALTER TABLE
来改变表中字段的相对位置。语法格式为:ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>;
- 字段1:指要修改位置的字段
- 数据类型:指字段1的数据类型
FIRST
:可选参数,指将字段1
修改为表的第一字段AFTER <字段2>
:指将字段1
插入到字段2
后面
修改字段为表的第一个字段
- 1.使用
DESC
命令查看teaphy_emp2
的表结构
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| n_name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
语句修改depid的位置
mysql> ALTER TABLE teaphy_emp2 MODIFY depid INT(11) FIRST;
Query OK, 0 rows affected (0.90 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.使用
DESC
命令查看teaphy_emp2
的表结构
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| depid | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| n_name | varchar(25) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
修改字段到表的指定列之后
- 1.使用
ALTER TABLE
语句,将depid放到salary字段后面
mysql> ALTER TABLE teaphy_emp2 MODIFY depid INT(11) AFTER salary;
Query OK, 0 rows affected (1.20 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 2.使用
DESC
命令查看teaphy_emp2
的表结构
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| n_name | varchar(25) | YES | | NULL | |
| salary | float | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
删除表的外键约束
对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系。MySQL中删除外键的语法格式:ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>
- 1.创建表teaphy_emp10,创建外键depId关联teaphy_emp1表的主键id
mysql> CREATE TABLE teaphy_emp10
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> depId INT(11),
-> CONSTRAINT fk_emp1 FOREIGN KEY (depId) REFERENCES teaphy_emp1(id)
-> );
Query OK, 0 rows affected (0.80 sec)
- 2.使用
SHOW CREATE TABLE
查看teaphy_emp10的表结构
mysql> SHOW CREATE TABLE teaphy_emp10 \G;
*************************** 1. row ***************************
Table: teaphy_emp10
Create Table: CREATE TABLE `teaphy_emp10` (
`id` int(11) NOT NULL,
`name` varchar(25) DEFAULT NULL,
`depId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp1` (`depId`),
CONSTRAINT `fk_emp1` FOREIGN KEY (`depId`) REFERENCES `teaphy_emp1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
- 3.使用
ALTER TABLE
语句删除外键约束fk_emp1
mysql> ALTER TABLE teaphy_emp10 DROP FOREIGN KEY fk_emp1;
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 4.使用
SHOW CREATE TABLE
查看teaphy_emp10的表结构
mysql> SHOW CREATE TABLE teaphy_emp10 \G;
*************************** 1. row ***************************
Table: teaphy_emp10
Create Table: CREATE TABLE `teaphy_emp10` (
`id` int(11) NOT NULL,
`name` varchar(25) DEFAULT NULL,
`depId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp1` (`depId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
可以看到,表teaphy_emp10中已经不存在FOREIGN KEY
,原有的外键约束fk_emp1
删除成功。
删除数据表
删除数据表就是将数据库中已经存在的表从数据库中删除。注意,在删除表的同时,表的定义和表中所有的数据均会被删除。因此,在进行删除操作之前,最好对表中的数据做一个备份,以免造成无法挽回的后果。
删除没有被关联的表
MySQL中,使用DROP TABLE可以一次删除一个或多个没有被其它表关联的数据表。语法格式为DROP TABLE [IF EXISTS]表1, 表2, . . . 表n;
其中:
表n
:指要删除的表的名称,后面可以同时删除多个表,只需要将删除的表名依次写在后面,相互之间用逗号隔开。
如果删除的表不存在,则MySQL会提示一条错误信息,ERROR 1051 (42S02): Unknown table <表名>
。
mysql> DROP TABLE teaphy;
ERROR 1051 (42S02): Unknown table 'teaphy.teaphy'
参数IF EXISTS
用于在删除前判断删除的表是否存在,加上该参数以后,再删除表的时候,如果表不存在,SQL语句可以顺利执行,但是会发出警告。
mysql> DROP TABLE IF EXISTS teaphy;
Query OK, 0 rows affected, 1 warning (0.05 sec)
删除被其它表关联的主表
在数据表之间存在外键关联的情况下,如果直接删除父表,结果会显示失败,原因是直接删除,将破坏表的参照完整性。如果必须要删除,可以先删除与之关联的子表,再删除父表。但是这样同时删除了两个表中的数据。但有的情况下可能要保留子表,这时如要单独删除父表,只需将关联的表的外键约束条件取消,然后就可以删除父表。
例如:
- 1.创建表teaphy_dept1
mysql> CREATE TABLE teaphy_dept1
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(10),
-> age INT(3)
-> );
Query OK, 0 rows affected (0.56 sec)
- 2.创建表teaphy_dept2
mysql> CREATE TABLE teaphy_dept2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(10),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES teaphy_dept1(id)
-> );
Query OK, 0 rows affected (0.87 sec)
- 3.使用
SHOW CREATE TABLE
命令查看teaphy_dept2的外键约束
mysql> SHOW CREATE TABLE teaphy_dept2 \G;
*************************** 1. row ***************************
Table: teaphy_dept2
Create Table: CREATE TABLE `teaphy_dept2` (
`id` int(11) NOT NULL,
`name` varchar(10) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept` (`deptId`),
CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `teaphy_dept1` (`id`)
) ENGINE=InnoDB DEFAULT C
可以看到,以上执行SQL语句,创建了两个关联表teaphy_dept1和teaphy_dept2,其中主表为teaphy_dept1,其主键id被子表teaphy_dept2所关联;从表为teaphy_dept2,具有名称为fk_emp_dept的外键约束
- 4.直接执行DROP TABLE
命令删除父表teaphy_dept1
mysql> DROP TABLE teaphy_dept1;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
从错误提示中,可以看出,在存在外键约束时,主表不能被直接删除
- 5.解除关联子表teaphy_dept2的外键约束fk_emp_dept
mysql> ALTER TABLE teaphy_dept2 DROP FOREIGN KEY fk_emp_dept;
Query OK, 0 rows affected (0.20 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 6.删除父表teaphy_dept1
mysql> DROP TABLE teaphy_dept1;
Query OK, 0 rows affected (0.40 sec)
参考文献
- MySQL 5.7 从零开始学