《MySQL 5.7 从零开始学》笔记-数据表基本操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/IO_Field/article/details/80977977

在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。

创建数据表

所谓创建数据表,指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程。

数据表属于数据库,在创建数据表之前,应该使用语句USE <数据库名>指定操作的是在哪一个数据库中进行,如果没有选择数据库,就会抛出”No database selected”的错误。

创建数据表的语句为CREATE TABLE,语法规则如下:

CREATE  TABLE <表名>
    (
    列名1,数据类型 [列级别约束条件] [默认值],
    列名2,数据类型 [列级别约束条件] [默认值],
    ……
    [表级别约束条件]
    );

使用CREATE TABLE创建表时,必须指定以下信息:

  1. 要创建的表的名称,不区分大小写,不能使用SQL语言中的关键字,如 DROP、ALTER、INSERT等
  2. 数据表中的每一个列(字段)的名称和数据类型。如果创建多个列,就要用逗号隔开。

例如:

  • 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语句格式分为两种情况:

扫描二维码关注公众号,回复: 2942403 查看本文章
  1. 在定义列的同时指定主键,语法规则为:字段名 数据类型 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)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。

唯一性约束的语法规则如下:

  1. 在定义完列之后直接指定唯一约束,语法规则为:字段名 数据类型 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

UNIQUEPRIMARY KEY的区别:

  1. 一个表中可以有多个字段声明为UNIQUE,但是只能有一个PRIMARY KEY声明
  2. 声明为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中,查看表结构使用DESCRIBESHOW 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>

  1. 使用SHOW CREATE TABLE语句,不仅可以查看数据表的创建语句,还可以查看存储引擎和字符编码
  2. 如果不加\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 已存在字段名];

其中:

  • 新字段名:指需要添加的字段名称

FIRSTAFTER 已存在字段名用于指定新增字段在表中的位置。如果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)

参考文献

  1. MySQL 5.7 从零开始学

猜你喜欢

转载自blog.csdn.net/IO_Field/article/details/80977977