Mysql教程

6.5本章实例

在本节中将在example数据库创建一个student表和一个grade表,内容如下两表所示。

student表

字段名字段描述数据类型主键外键非空唯一自增
num学号INT(10)
name姓名VARCHAR(20)
sex性别VARCHAR(4)
birthday出生日期DATETIME
address家庭住址VARCHAR(50)

grade表

字段名字段描述数据类型主键外键非空唯一自增
id编号INT(10)
cource课程名VARCHAR(10)
s_num学号INT(10)
grade成绩VARCHSR(4)

表创建成功后,查看两个表的结构。然后按照下列要求进行表操作:

(1)将grade表的course字段的数据类型改为VARCHAR(20)。

(2)将s_num字段的位置改到course字段的前面。

(3)将grade字段改名为score。

(4)删除grade表的外键约束。

(5)将grade表的存储引擎更改为MyISAM类型。

(6)将student表的address字段删除。

(7)在student表中增加名为phone的字段,数据类型int(10)。

(8)将grade 表改名为 gradeInfo。

(9)删除student表

本实例的执行过程如下:

1.登录数据库系统

mysql -h localhost -u root -p

提示输入密码后,按要求输入密码。

2.选择example数据库

先查看数据库系统中是否存在example数据库,执行SHOW DATABASES语句。代码执行如下:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| example            |
| landingbj          |
| mysql              |
+--------------------+
4 rows in set (0.09 sec)

结果显示数据库系统中已经存在名为example的数据库。要创建表,就必须先选择数据库。MySQL中使用USE语句选择数据库。代码执行如下:

USE example

.创建student表和grade表

按表6.2的要求创建student表,SQL代码如下:

CREATE TABLE student( num INT(10) NOT NULL UNIQUE PRIMARY KEY, name VARCHAR(20) NOT NULL , sex VARCHAR(4) NOT NULL , birthday DATETIME , address VARCHAR(50)

代码执行后,使用DESC语句来查看表结构。DESC语句执行如下:

mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| num      | int(10)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | NO   |     | NULL    |       |
| sex      | varchar(4)  | NO   |     | NULL    |       |
| birthday | datetime    | YES  |     | NULL    |       |
| address  | varchar(50) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

再按表6.3的要求创建grade表。SQL代码如下:

CREATE TABLE grade( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,course VARCHAR(10) NOT NULL , s_num INT(10) NOT NULL, grade VARCHAR(4),CONSTRAINT grade_fk FOREIGN KEY (s_num)REFERENCES student(num));

代码执行后,使用SHOW CREAT TABLE语句来查看表结构。语句执行如下:

mysql> SHOW CREATE TABLE grade \G;
*************************** 1. row ***************************
       Table: grade
Create Table: CREATE TABLE `grade` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `course` varchar(10) NOT NULL,
  `s_num` int(10) NOT NULL,
  `grade` varchar(4) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `grade_fk` (`s_num`),
  CONSTRAINT `grade_fk` FOREIGN KEY (`s_num`) REFERENCES `student` (`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

执行结果显示,grade表的外键s_num字段依赖于student表的num字段。默认的存储 引攀为lnnoDB。

4.强grade表的course字段的数据类型改为VARCHAR(20)

上面的程序显示,course的数据类型为VARCHAR(10),下面执行ALTER语句,强其数据类型改为VARCHAR(20)代码如下:

ALTER TABLE grade MODIFY course VARCHAR(20);

执行EDSC语句查询grade表的结构

DESC grade
mysql> desc grade;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| course | varchar(20) | YES  |     | NULL    |                |
| s_num  | int(10)     | NO   | MUL | NULL    |                |
| grade  | varchar(4)  | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

结果显示,course字段的数据类型已经变成VARCHAR(20)。

5.将s_num字段的位置改到course字段的前面

上面的查询结果显示,s_num字段排在course字段之后。执行ALTER语句,来改变S_num字段的排列位置。执行代码如下:

mysql> ALTER TABLE grade MODIFY s_num INT(10) AFTER id;

执行结果显示修改成功。执行DESC语句查询grade表的结构。代码执行如下:

mysql> DESC grade;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| s_num  | int(10)     | YES  | MUL | NULL    |                |
| course | varchar(20) | YES  |     | NULL    |                |
| grade  | varchar(4)  | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

结果显示,s_num字段已经排在couse之前了。

6.将grade字段改名为score。

使用ALTER语句将grade字段改名为score,代码如下:

ALTER TABLE grade CHANGE grade score VARCHAR(4);

执行DESC语句查询grade的表结构。可以发现修改成功

mysql> desc grade;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| s_num  | int(10)     | YES  | MUL | NULL    |                |
| course | varchar(20) | YES  |     | NULL    |                |
| score  | varchar(4)  | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

7.删除grade表的外键约束。

上面已经知道gmde表的存储引擎为InnoDB。下面执行ALTER语句将其存储引擎改SMylSAM。代码执行如下:

ALTER TABLE grade ENGINE=MyISAM;

执行失败。结果显示为外键约束限制了本次操作。为了更改存储引擎,先将外键约束 删除。删除外键约束的代码执行如下:

ALTER TABLE grade DROP FOREIGN KEY grade_fk;

代码执行成功。为了确定外键是否己经删除,执行SHOW CREATE TABLE来査看一 下。代码执行如下:

mysql> SHOW CREATE TABLE grade \G;
*************************** 1. row ***************************
       Table: grade
Create Table: CREATE TABLE `grade` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `s_num` int(10) DEFAULT NULL,
  `course` varchar(20) DEFAULT NULL,
  `score` varchar(4) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `grade_fk` (`s_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

8.将grade表的外键存储引擎更改为MyISAM类型

删除了外键约束,现在可以安全的更改存储引擎的类型了。代码执行如下:

mysql> ALTER TABLE grade ENGINE=MylSAM;

代码执行成功。为了确定存储引擎是否已经发生改变,SSHOW CREATE TABLE 语句来査看一下。代码执行如下:

mysql> SHOW CREATE TABLE grade \G;
*************************** 1. row ***************************
       Table: grade
Create Table: CREATE TABLE `grade` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `s_num` int(10) DEFAULT NULL,
  `course` varchar(20) DEFAULT NULL,
  `score` varchar(4) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `grade_fk` (`s_num`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

结果显示,存储引擎已经变成了MyISAM。

9.将student表的address字段删除

使用ALTER语句可以删除表的字段。代码执行如下:

ALTER TABLE student DROP address;

代码执行成功。为了确定student表中是否还存在address字段,执行DESC语句来查 看一下。代码执行如下:

mysql> DESC student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| num      | int(10)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | NO   |     | NULL    |       |
| sex      | varchar(4)  | NO   |     | NULL    |       |
| birthday | datetime    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

结果显示,student表中已经不存在address字段。

10.在student表中增加名为phone的字段

在student表中增加名为phone的字段,其数据类型为INT(10).代码如下:

ALTER TABLE student ADD phone INT(10);

代码执行成功。为了确定example数据库中是否还存在student表,执行SHOW TABLES语句来查看一下。代码执行如下:

mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| num      | int(10)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | NO   |     | NULL    |       |
| sex      | varchar(4)  | NO   |     | NULL    |       |
| birthday | datetime    | YES  |     | NULL    |       |
| phone    | int(10)     | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.02 sec)

11.将grade表改名为gradeInfo

使用ALTER语句可以更改表的名称,代码如下:

ALTER TABLE grade RENAME gradeInfo;

代码执行成功,为了确定example数据库中是否已经存在gradeInfo表,执行SHOW TABLES语句查看:

mysql> show tables;
+-------------------+
| Tables_in_example |
+-------------------+
| gradeinfo         |
| student           |
+-------------------+
2 rows in set (0.00 sec)

12.删除student表

执行代码DROP TABLE语句可以删除表。代码如下:

DROP TABLE student;

代码执行成功。为了确定example数据库中是否还存在student表,执行SHOW TABLES语句来查看一下。代码执行如下:

mysql> show tables;
+-------------------+
| Tables_in_example |
+-------------------+
| gradeinfo         |
+-------------------+
1 row in set (0.00 sec)

结果显示,example数据库只有gradeInfo表。student表已经成功删除。此处要特別注意,因为在创建表时student表是grade表的父表,不能直接删除。但是,在更改存储引擎 时,已经将grade表的外键约束删除了。这样,就解除了两者之间的父子关系,才可以直 接用这个方法删除3也^也表。详细内容参照6.4节。到现在为止,本实例算是成功完成了。希望读者通过本实例能够对本章的内容有个更 加深刻的理解。


关注微信获取最新动态