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节。到现在为止,本实例算是成功完成了。希望读者通过本实例能够对本章的内容有个更 加深刻的理解。