mysql系列之一数据表基本操作

一、数据库基本操作

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)


你可能感兴趣的:(数据库,mysql,基本操作)