一、数据库基本操作
1、创建数据库,并指定字符集为utf8 mysql> CREATE DATABASE hellodb CHARACTER SET utf8; 2、查询数据库 mysql> SHOW DATABASES; #查看存在的所有数据库(root才能查看所有) mysql> SHOW CREATE DATABASE hellodb \G; #查看数据库定义信息 3、删除数据库 mysql> DROP DATABASE hellodb;
二、数据表的基本操作
1、创建数据表
语法格式为:CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options] [partition_options]
例子1:
首先选择创建表的数据库,SQL语句如下 mysql> USE hellodb; 创建tb_text1表,SQL语句为: mysql> CREATE TABLE tb_text1 (id INT(11),name VARCHAR(25),deptld INT(11),salary FLOAT); Query OK, 0 rows affected (0.10 sec) #表示创建成功 查看一下创建的表,SQL语句如下: mysql> SHOW TABLES; +-------------------+ | Tables_in_hellodb | +-------------------+ | tb_text1 | +-------------------+ 1 row in set (0.00 sec)
例子2:
使用主键约束 (1)、单字段主键,可以有两种方法,具体SQL语句如下: 创建数据表tb_text2,其主键为id(直接在列后面定义); mysql> CREATE TABLE tb_text2 (id INT(11)PRIMARY KEY,name VARCHAR(25), deptld INT(11),salary FLOAT); Query OK, 0 rows affected (0.40 sec) 创建数据表tb_text3,其主键为id(定义在所有列之后); mysql> CREATE TABLE tb_text3 (id INT(11),name VARCHAR(25),deptld INT(11), salary FLOAT,PRIMARY KEY(id)); Query OK, 0 rows affected (0.40 sec) (2)、多字段联合主键(name,deptld联合在一起成为联合主键) mysql> CREATE TABLE tb_text4 (id INT(11),name VARCHAR(25),deptld INT(11), salary FLOAT,PRIMARY KEY(name,deptld)); Query OK, 0 rows affected (0.03 sec)
例子3:外键约束
外键是用来在两个表的数据之间建立链接,它可以是一列或者多列,一个表可以有一个或多个外键,外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键:首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键。外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行,外键的作用是保持数据的一致性、完整性。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。
创建主表tb_dept1,主键为id; mysql> CREATE TABLE tb_dept1 (id INT(11)PRIMARY KEY,name VARCHAR(22) NOT NULL, location VARCHAR(50)); Query OK, 0 rows affected (0.38 sec) 创建从表tb_text5,让它的键deptld作为外键关联到主表的id; mysql> CREATE TABLE tb_text5 (id INT(11)PRIMARY KEY,name VARCHAR(25),deptld INT(11), salary FLOAT,CONSTRAINT fk_emp_deptl FOREIGN KEY(deptld)REFERENCES tb_dept1(id)); Query OK, 0 rows affected (0.05 sec) #在表tb_text5上添加了一个名称为fk_emp_deptl的外 键约束,外键名称为deptld,其依赖于表tb_dept1的主键id。
关联指的是在关系型数据库中,相关表之间的联系,它是通过相容或相同的属性或属性组来表示的,子表的外键必须关联主表的主键,且关联字段得数据类型必须匹配,如果类型不一样,则创建子表时,就会出现错误“ERROR 1005(HY000):Cant't create table 'database.tablename'(errno:150)"
例子4:使用非空约束
非空约束(Not Null Constraint)指字段得值不能为空,对于使用了非空约束得字段,如果用户在添加数据时没有指定值,数据库就会报错。
mysql> CREATE TABLE tb_text6 (id INT(11)PR`IMARY KEY,name VARCHAR(25)NOT NULL,deptld INT(11),salary FLOAT,CONSTRAINT fk_emp_deptl2 FOREIGN KEY (deptld)REFERENCES tb_dept1(id)); Query OK, 0 rows affected (0.42 sec) #在tb_text6中创建的name字段不允许为空
例子5:唯一性约束
唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。
(1)在定义完列之后直接指定唯一约束 mysql> CREATE TABLE tb_dept2 ( id INT (11)PRIMARY KEY,name VARCHAR(22)UNIQUE, location VARCHAR(45)); Query OK, 0 rows affected (0.48 sec) (2)定义完所有列之后指定唯一约束 mysql> CREATE TABLE tb_dept3 (id INT(11)PRIMARY KEY,name VARCHAR(22),location VARCHAR(50),CONSTRAINT STH UNIQUE(name)); Query OK, 0 rows affected (0.05 sec)
UNIQUE和PRIMARY KEY的区别:一个表中可以有多个字段声明为UNIQUE,但只能有一个PRIMARY KEY声明;声明为PRIMARY KEY的列不允许有空值,但是声明为UNIQUE的字段允许空值(NULL)的存在。
例子6:默认约束(下面使用mariadb测试)
默认约束(Default Constraint)指定某列的默认值。如男性同学较多,性别可以默认为‘男’。如果插入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值为‘男’。
MariaDB [hellodb]> CREATE TABLE tb_text7 (id INT(11)PRIMARY KEY,name VARCHAR(25) NOT NULL,deptld INT(11)DEFAULT 1111,salary FLOAT,CONSTRAINT fk_emp_dept3 FOREIGN KEY(deptld)REFERENCES tb_dept1(id)); Query OK, 0 rows affected (0.06 sec)
以上语句执行成功过后,表tb_text7上的字段deptld拥有了一个默认值1111,新插入的记录如果没有指定部门编号,则默认都为1111。
例子7:设置表属性值自动增加
在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段得主键值。可以通过为表添加AUTO_INCREMENT关键字来实现。默认的,在MYSQL中AUTO_INCREMENT的初始值是1,每增加一条记录,字段值自动加1.一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLIN、INT、BIGINT等)。
MariaDB [hellodb]> CREATE TABLE tb_text8 (id INT(11)PRIMARY KEY AUTO_INCREMENT, name VARCHAR(25)NOT NULL,deptld INT(11),salary FLOAT,CONSTRAINT fk_emp_dept5 FOREIGN KEY(deptld)REFERENCES tb_dept1(id)); Query OK, 0 rows affected (0.41 sec)
插入数据到表中,查看是否自动添加
MariaDB [hellodb]> INSERT INTO tb_text8(name,salary) VALUES ('Lucy',1000), ('Lura',1200),('Kevin',1500); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 MariaDB [hellodb]> SELECT * FROM tb_text8; +----+-------+--------+--------+ | id | name | deptld | salary | +----+-------+--------+--------+ | 1 | Lucy | NULL | 1000 | | 2 | Lura | NULL | 1200 | | 3 | Kevin | NULL | 1500 | +----+-------+--------+--------+ 3 rows in set (0.00 sec) #可以看到id自动编号,在这里并没有给值到id;
2、查看数据表结构
2.1、查看表的基本结构
语法:DESC 表名; MariaDB [hellodb]> DESC tb_text8; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(25) | NO | | NULL | | | deptld | int(11) | YES | MUL | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+----------------+ 4 rows in set (0.01 sec) NULL:表示该列可以存储NULL值。 Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部 分;MUL表示在列中某个给定值允许出现多次。 Default:表示该列是否有默认值,如果有的话值是多少。 Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMNENT等。
2.2、查看表的详细结构
语法:SHOW CREATE TABLE <表名\G>; MariaDB [hellodb]> SHOW CREATE TABLE tb_text8\G; *************************** 1. row *************************** Table: tb_text8 Create Table: CREATE TABLE `tb_text8` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(25) NOT NULL, `deptld` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_emp_dept5` (`deptld`), CONSTRAINT `fk_emp_dept5` FOREIGN KEY (`deptld`) REFERENCES `tb_dept1` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
使用SHOW CREATE TABLE语句,不仅可以查看表创建时候的详细语句,而且还可以查看存储引擎和字符编码。如果不加'\G'参数,显示的结果可能非常混乱,加上参数'\G'之后,可使显示结果更加直观,易于查看。
2.3、修改数据表
2.3.1、修改表名 语法:ALTER TABLE <旧表名> RENAME [TO] <新表名>; 例如: MariaDB [hellodb]> SHOW TABLES; +-------------------+ | Tables_in_hellodb | +-------------------+ | tb_dept1 | | tb_dept2 | | tb_dept3 | | tb_text1 | | tb_text2 | | tb_text3 | | tb_text4 | | tb_text5 | | tb_text6 | | tb_text7 | | tb_text8 | +-------------------+ 11 rows in set (0.00 sec) MariaDB [hellodb]> ALTER TABLE tb_dept3 RENAME tb_deptment3; Query OK, 0 rows affected (0.02 sec) #修改表tb_dept3的名字为tb_deptment3 MariaDB [hellodb]> SHOW TABLES; #可以看出修改结果 +-------------------+ | Tables_in_hellodb | +-------------------+ | tb_dept1 | | tb_dept2 | | tb_deptment3 | | tb_text1 | | tb_text2 | | tb_text3 | | tb_text4 | | tb_text5 | | tb_text6 | | tb_text7 | | tb_text8 | +-------------------+ 11 rows in set (0.00 sec) 2.3.2、修改字段的数据类型 语法:ALTER TABLE <表名> MODIFY <字段名> <数据类型> 例如: MariaDB [hellodb]> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | NO | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) MariaDB [hellodb]> ALTER TABLE tb_dept1 MODIFY name VARCHAR(30); Query OK, 0 rows affected (0.52 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [hellodb]> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) #可以看到name字段varchar(30)已经修改成功 2.3.3、修改字段名 语法:ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>; 例如: MariaDB [hellodb]> ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50); MariaDB [hellodb]> DESC tb_dept1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) #可以看到location改成loc; MariaDB [hellodb]> ALTER TABLE tb_dept1 CHANGE loc location VARCHAR(60); MariaDB [hellodb]> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(60) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) #字段和数据类型都改了 #由于不同类型的数据在机器中存储的方式及长度并不相同,修改数据类型可能会影响到数据表中已 有的数据记录。因此,当数据库表中已经有数据时,不要轻易修改数据类型。 2.3.4、添加字段 ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件][FIRST|AFTER 已存在的字段名]; 例如1: MariaDB [hellodb]> ALTER TABLE tb_dept1 ADD managerld INT(10); #添加一个没有完整性约束的INT类型的字段managerld; MariaDB [hellodb]> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(60) | YES | | NULL | | | managerld | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) 例如2: #添加一个不能为空的VARCHAR类型的字段cohumml; MariaDB [hellodb]> ALTER TABLE tb_dept1 ADD cohumnl VARCHAR(12)NOT NULL; MariaDB [hellodb]> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(60) | YES | | NULL | | | managerld | int(10) | YES | | NULL | | | cohumnl | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec) #在表的第一列添加一个类型为INT的cohumn2的字段; MariaDB [hellodb]> ALTER TABLE tb_dept1 ADD cohumn2 INT(11)FIRST; Query OK, 0 rows affected (0.40 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [hellodb]> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | cohumn2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(60) | YES | | NULL | | | managerld | int(10) | YES | | NULL | | | cohumnl | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec) #在指定列之后添加字段 MariaDB [hellodb]> ALTER TABLE tb_dept1 ADD cohumn3 INT(11)AFTER name; MariaDB [hellodb]> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | cohumn2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | cohumn3 | int(11) | YES | | NULL | | | location | varchar(60) | YES | | NULL | | | managerld | int(10) | YES | | NULL | | | cohumnl | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 7 rows in set (0.01 sec) 2.3.5、删除字段 语法:ALTER TABLE <表名> DROP <字段名>; #删除tb_dept1表的cohumn3字段 MariaDB [hellodb]> ALTER TABLE tb_dept1 DROP cohumn3; MariaDB [hellodb]> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | cohumn2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(60) | YES | | NULL | | | managerld | int(10) | YES | | NULL | | | cohumnl | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec) 2.3.6、修改字段排列位置 ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>; “字段1”指要修改位置的字段,“数据类型“指”字段1“的数据类型,”FIRST“为可选参数, 指将“字段1”修改为表的第一个字段,“AFTER 字段2”指将”字段1“插入到”字段2“后面。 例如: #将表tb_dept1的cohumn1字段修改为表的第一个字段 MariaDB [hellodb]> ALTER TABLE tb_dept1 MODIFY cohumn1 VARCHAR(12)FIRST; MariaDB [hellodb]> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | cohumn1 | varchar(12) | YES | | NULL | | | cohumn2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(60) | YES | | NULL | | | managerld | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec) #修改字段到表的指定列之后 MariaDB [hellodb]> ALTER TABLE tb_dept1 MODIFY cohumn2 VARCHAR(12)AFTER location; MariaDB [hellodb]> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | cohumn1 | varchar(12) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(60) | YES | | NULL | | | cohumn2 | varchar(12) | YES | | NULL | | | managerld | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.01 sec)
2.4、修改表的存储引擎
语法:ALTER TABLE <表名> ENTINE=<更改后的存储引擎名>; 例如: #修改表tb_deptment3的存储引擎为MyISAM; MariaDB [hellodb]> SHOW CREATE TABLE tb_deptment3\G; *************************** 1. row *************************** Table: tb_deptment3 Create Table: CREATE TABLE `tb_deptment3` ( `id` int(11) NOT NULL, `name` varchar(22) DEFAULT NULL, `location` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `STH` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) MariaDB [hellodb]> ALTER TABLE tb_deptment3 ENGINE=MyISAM; MariaDB [hellodb]> SHOW CREATE TABLE tb_deptment3\G; *************************** 1. row *************************** Table: tb_deptment3 Create Table: CREATE TABLE `tb_deptment3` ( `id` int(11) NOT NULL, `name` varchar(22) DEFAULT NULL, `location` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `STH` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
2.5、删除表的外键约束
语法:ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>; 例子: #先创建一个名为tb_text9的表; MariaDB [hellodb]> CREATE TABLE tb_text9 (id INT(11)PRIMARY KEY,name VARCHAR(25), deptld INT(11),salary FLOAT,CONSTRAINT fk_emp_dept FOREIGN KEY(deptld)REFERENCES tb_dept1(id)); Query OK, 0 rows affected (0.43 sec) MariaDB [hellodb]> SHOW CREATE TABLE tb_text9\G; *************************** 1. row *************************** Table: tb_text9 Create Table: CREATE TABLE `tb_text9` ( `id` int(11) NOT NULL, `name` varchar(25) DEFAULT NULL, `deptld` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_emp_dept` (`deptld`), CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptld`) REFERENCES `tb_dept1` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) #可以看到成功添加了外键 MariaDB [hellodb]> ALTER TABLE tb_text9 DROP FOREIGN KEY fk_emp_dept; #删除名称为fk_emp_dept的外键约束 MariaDB [hellodb]> SHOW CREATE TABLE tb_text9\G; *************************** 1. row *************************** Table: tb_text9 Create Table: CREATE TABLE `tb_text9` ( `id` int(11) NOT NULL, `name` varchar(25) DEFAULT NULL, `deptld` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_emp_dept` (`deptld`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) #表中不存在POREIGN KEY,fk_emp_dept外键约束删除成功
2.6、删除数据表
2.6.1、删除没有被关联的表 语法:DROP TABLE [IF EXISTS]表1,表2,...表n; MariaDB [hellodb]> SHOW TABLES; +-------------------+ | Tables_in_hellodb | +-------------------+ | tb_dept1 | | tb_dept2 | | tb_deptment3 | | tb_text1 | | tb_text2 | | tb_text3 | | tb_text4 | | tb_text5 | | tb_text6 | | tb_text7 | | tb_text8 | | tb_text9 | +-------------------+ 12 rows in set (0.00 sec) MariaDB [hellodb]> DROP TABLE tb_dept2; MariaDB [hellodb]> SHOW TABLES; +-------------------+ | Tables_in_hellodb | +-------------------+ | tb_dept1 | | tb_deptment3 | | tb_text1 | | tb_text2 | | tb_text3 | | tb_text4 | | tb_text5 | | tb_text6 | | tb_text7 | | tb_text8 | | tb_text9 | +-------------------+ 11 rows in set (0.00 sec) 2.6.2、删除被其他表关联的主表 MariaDB [hellodb]> CREATE TABLE tb_dept2 (id INT(11)PRIMARY KEY,name VARCHAR(22), location VARCHAR(50)); Query OK, 0 rows affected (0.42 sec) MariaDB [hellodb]> CREATE TABLE tb_emp (id INT(11)PRIMARY KEY,name VARCHAR(25), deptld INT(11),salary FLOAT,CONSTRAINT fk_emp_dept FOREIGN KEY(deptld)REFERENCES tb_dept2(id)); Query OK, 0 rows affected (0.06 sec) MariaDB [hellodb]> SHOW CREATE TABLE tb_emp\G; *************************** 1. row *************************** Table: tb_emp Create Table: CREATE TABLE `tb_emp` ( `id` int(11) NOT NULL, `name` varchar(25) DEFAULT NULL, `deptld` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_emp_dept` (`deptld`), CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptld`) REFERENCES `tb_dept2` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) MariaDB [hellodb]> DROP TABLE tb_dept2; ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails #可以看到,有外键约束时,不能删除主表; MariaDB [hellodb]> ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept;#取消约束 MariaDB [hellodb]> DROP TABLE tb_dept2; #删除成功; Query OK, 0 rows affected (0.01 sec)