MySQL数据表操作-删除数据表(DROP TABLE)

末蓝、 2022-10-27 01:41 683阅读 0赞

基本语法

使用 DROP TABLE 语句可以删除一个或多个数据表,在删除表的同时,表的结构和表中所有的数据都会被删除,因此在删除数据表之前最好先备份,以免造成无法挽回的损失。

语法格式如下:

  1. DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]

对语法格式的说明如下:

  • 表名1, 表名2, 表名3 ...表示要被删除的数据表的名称。DROP TABLE 可以同时删除多个表,只要将表名依次写在后面,相互之间用逗号隔开即可。
  • IF EXISTS 用于在删除数据表之前判断该表是否存在。如果不加 IF EXISTS,当数据表不存在时 MySQL 将提示错误,中断 SQL 语句的执行;加上 IF EXISTS 后,当数据表不存在时 SQL 语句可以顺利执行,但是会发出警告(warning)。

两点注意:

  • 用户必须拥有执行 DROP TABLE 命令的权限,否则数据表不会被删除。
  • 表被删除时,用户在该表上的权限不会自动删除。

实例

  1. mysql> show tables;
  2. +-------------------+
  3. | Tables_in_test_db |
  4. +-------------------+
  5. | es_diff |
  6. | t_create_table |
  7. | temp_as |
  8. | temp_to |
  9. | vc_diff |
  10. +-------------------+
  11. 5 rows in set (0.00 sec)
  12. mysql> drop table if exists es_diff, vc_diff;
  13. Query OK, 0 rows affected (0.03 sec)
  14. mysql> show tables;
  15. +-------------------+
  16. | Tables_in_test_db |
  17. +-------------------+
  18. | t_create_table |
  19. | temp_as |
  20. | temp_to |
  21. +-------------------+
  22. 3 rows in set (0.00 sec)
  23. mysql> drop table t_create_table;
  24. Query OK, 0 rows affected (0.02 sec)
  25. mysql> show tables;
  26. +-------------------+
  27. | Tables_in_test_db |
  28. +-------------------+
  29. | temp_as |
  30. | temp_to |
  31. +-------------------+
  32. 2 rows in set (0.00 sec)

删除被其它表关联的主表

数据表之间经常存在外键关联的情况,这时如果直接删除父表,会破坏数据表的完整性,也会删除失败。

删除父表有以下两种方法:

  • 先删除与它关联的子表,再删除父表;但是这样会同时删除两个表中的数据。
  • 将关联表的外键约束取消,再删除父表;适用于需要保留子表的数据,只删除父表的情况。(推荐)

推荐第二种方法,取消关联表的外键约束并删除主表

  1. 创建关联表

    mysql> CREATE TABLE test_db.foreign_key_father (

    1. -> id BIGINT auto_increment NOT NULL,
    2. -> name varchar(100) NULL,
    3. -> sex INT NULL,
    4. -> CONSTRAINT foreign_key_father_PK PRIMARY KEY (id)
    5. -> )
    6. -> ENGINE=InnoDB
    7. -> DEFAULT CHARSET=utf8mb4
    8. -> COLLATE=utf8mb4_general_ci
    9. -> COMMENT='';

    Query OK, 0 rows affected (0.03 sec)

    mysql> CREATE TABLE test_db.foreign_key_child (

    1. -> idno BIGINT auto_increment NOT NULL,
    2. -> sex INT NULL,
    3. -> name varchar(100) NULL,
    4. -> salary FLOAT NULL,
    5. -> CONSTRAINT foreign_key_child_PK PRIMARY KEY (idno),
    6. -> CONSTRAINT foreign_key_child_FK FOREIGN KEY (idno) REFERENCES test_db.foreign_key_father(id)
    7. -> )
    8. -> ENGINE=InnoDB
    9. -> DEFAULT CHARSET=utf8mb4
    10. -> COLLATE=utf8mb4_general_ci
    11. -> COMMENT='';

    Query OK, 0 rows affected (0.03 sec)

    mysql> show tables;
    +——————————+
    | Tables_in_test_db |
    +——————————+
    | foreign_key_child |
    | foreign_key_father |
    | temp_as |
    | temp_to |
    +——————————+
    4 rows in set (0.01 sec)

    mysql> show create table foreign_key_child \G
    * 1. row *

    1. Table: foreign_key_child

    Create Table: CREATE TABLE foreign_key_child (
    idno bigint(20) NOT NULL AUTO_INCREMENT,
    sex int(11) DEFAULT NULL,
    name varchar(100) DEFAULT NULL,
    salary float DEFAULT NULL,
    PRIMARY KEY (idno),
    CONSTRAINT foreign_key_child_ibfk_1 FOREIGN KEY (idno) REFERENCES foreign_key_father (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    1 row in set (0.00 sec)

foreign_key_father 为父表,foreign_key_child 为子表,存在名称为 foreign_key_child_ibfk_1 的外键约束,foreign_key_child 表的 idno 字段关联 foreign_key_father 表的 id 字段

  1. 删除主表

    mysql> drop table if exists foreign_key_father;
    ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

报错,提示主表在存在外键约束时,不能被直接删除

  1. 取消外键约束

    mysql> alter table foreign_key_child drop foreign key foreign_key_child_ibfk_1;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0 Duplicates: 0 Warnings: 0

  2. 删除主表

    mysql> drop table if exists foreign_key_father;
    Query OK, 0 rows affected (0.02 sec)

    mysql> show tables;
    +—————————-+
    | Tables_in_test_db |
    +—————————-+
    | foreign_key_child |
    | temp_as |
    | temp_to |
    +—————————-+
    3 rows in set (0.00 sec)

发表评论

表情:
评论列表 (有 0 条评论,683人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL 删除数据表

      MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。   以下为删除MySQL数据表的通用语法:   DR