通过前面的小节,我们已然有了足够的知识储备。在接下来的章节,我们将真正开始数据库之旅——这一小节主要讲解对数据库数据表进行“创建”、“修改”、“删除”操作。希望读者在读后能够掌握建库、建表,以及对数据库的切换操作。
本文概览:
(一)操纵数据库
(二)操纵数据表
(三)实战
(四)总结
(一)操纵数据库
(1)创建数据库需要使用 CREATE DATABASE 语句,删除数据库需要使用 DROP DATABASE 语句,修改数据库需要使用 ALTER DATABASE 语句。该语句汇总如下:
--创建数据库 ----当试图创建一个已存在的数据库时,系统会报错,而加上IF NOT EXISTS子句则可避免此类错误 CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ CHARACTER SET 指定字符集 ] [ COLLATE 排序规则 ]; --删除数据库 DROP DATABASE 数据库名; --修改数据库 ALTER DATABASE 数据库名 [ CHARACTER SET 指定字符集 ] [ COLLATE 排序规则 ];
ps:请将“数据库名”更换为你自己的数据库名。
(2)切换到 “默认数据库” 的两种方法
① 使用 “ USE 数据库名; ” 语句。
创建了数据库并不代表会将该数据库作为当前的上下文。如果对这个说法持怀疑态度,那么可通过以下代码进行测试,结果必然显示为NULL(表示“空”的意思):
CREATE DATABASE 数据库名; SELECT DATABASE();
USE 数据库名; SELECT DATABASE();
ps:
CREATE DATABASE语句只是创建某个数据库,并不会顺手牵羊,直接地使它作为当前默认的数据库。
这一点和Linux系统的“mkdir 目录名”用法极为相似,难道不是吗?想一下,你创建了一个目录,你直接就能处于目录中了?当然不能,系统可不会帮你切换至该目录!想要达到这效果,你还需要用cd命令呢!
② 在连接服务器时,将某个特定的数据库以“参数”的形式一并给出,从而将之设置为上下文,即默认数据库。如下:
mysql -p -uroot 数据库名
(二)操纵数据表
(1)创建数据表需要使用 CEATE TABLE 语句,删除数据表需要使用 DROP TABLE 语句,修改数据表需要使用 ALTER TABLE 语句。
--创建表
----当试图创建一个已存在的数据表时,系统会报错,而加上IF NOT EXISTS子句则可避免此类错误 CREATE TABLE [ IF NOT EXISTS ] 数据表名(列定义) ENGINE=指定要用的存储引擎; --删除表
----当当试图删除一个不存在的数据表时,系统会报错,而加上IF EXISTS子句则可避免此类错误 DROP TABLE [ IF EXISTS ] 数据表名; --修改表 ALTER TABLE 数据表名 操纵动作 列名 列定义; ----改列的数据类型 alter table 数据表名 change 列名 新列名 列定义; ----改表引擎 alter table 数据表名 engine=指定要用的存储引擎; ----改表名 alter table 数据表名 rename to 新表名;
列定义包括三点:列名、列的数据类型、列的一些其他属性,皆在上节做了介绍。
(2)切换数据表
① 数据表的切换是依靠 FROM 数据表名 进行的,但这个子句无法单独使用,需要与“特定的操作进行配套使用”,如SELECT、UPDATE、DELETE,指代对数据表里的某些内容进行某项操作。
② 当引用多个数据表时,可能有存在几个相同列名的情况,为此就需要为这几个列额外标注上下文,避免二义性的产生。
ps:本来这点是不值得写的,但由于笔者在前面对数据库的切换进行了说明,为考虑完整的体系,在此画蛇添足。
(三)实战(请读者亲自实践一下)
CREATE DATABASE SIMS; -- Student Information Management System USE SIMS; CREATE TABLE student ( student_id INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(student_id), name VARCHAR(20) NOT NULL, gender ENUM(\'F\', \'M\') ); CREATE TABLE course ( course_id SMALLINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(course_id), name VARCHAR(20) ); CREATE TABLE score ( student_id INT UNSIGNED NOT NULL, course_id SMALLINT UNSIGNED NOT NULL, score DECIMAL(2), PRIMARY KEY(student_id, course_id), INDEX (course_id), FOREIGN KEY (student_id) REFERENCES student (student_id), FOREIGN KEY (course_id) REFERENCES course(course_id) );
ps:
用于创建score 的SQL语句中,DECIMAL(2)等同于DECIMAL(2, 0)。如果是按百分制规则,那么将score列设置为DECIMAL(2)就恐有不适。下面粗略提下DECIMAL的用法:
DECIMAL(M, D) M表示有效数字的精度,D表示小数点后的位数。
因此,DECIMAL(M, D)表示的是存储D位小数的M位数字。又由于它通常用在定义列中,因此是对该列存储的精度进行限制。举例来说,上面的score DECIMAL(2)解析出来就是score列中存储的数据为2位数且没有小数,即-99~99。而DECIMAL(5, 2)又表示什么?请读者自己尝试回答。注意“2”占用了“5”的部分。
鉴于笔者已在本地创建好了数据库,因此下面只使用show等语句代为检验(该语句是下节要讲解的内容,这里不做过多赘述):
(四)总结
现实生活中,我们时常会说“拿什么”,“做什么”这样类似的话,这同样反映在数据库世界里。这里的“拿”、“做”是施加的一个动作,而“什么”则表现为一个具体的对象——比如我们说数据库A,数据库甲皆是如此,A或甲是我们人为对数据库进行区分的一个标识。
明确下我们的目标是对特定的数据库、数据表进行操纵,因此我们需要了解足够的信息:
①数据库关键字为 DATABASE ,数据表关键字为 TABLE 。
②操纵关键字有三,依次为 CREATE 、 ALTER 、 DROP 。
③由于是针对于特定的数据库数据表,我们就需要在DATABASE或TABLE之后指定好名称(为什么是在之后而不是之前呢?比如你想叫住a先生,用英文的说法是不是说成Mr. a ?这是我自己于记忆此内容的一个自我解释,供读者参考)。
综合上述,比如当我们需要创建某个数据库,就应该把语句写为 CREATE DATABASE 某个数据库名;,对于数据表的操作亦如是。
下面留一个小作业,供心有余力的读者查阅。
对于所学内容,在使用过程中总会遇到一些挫折。因而越早碰见并解决它们便能形成为自己的使用经验。笔者在使用过程中也的确如此,下面分享一下该问题、问题的来源及解决方案。
强烈建议读者在查看解决方案之前,先对比一下的下面两张图有什么不同(按照提示排错),思考为什么第一张图中的语句会报错?应该如何解决?
解决方案链接:https://stackoverflow.com/questions/15534977/mysql-cannot-add-foreign-key-constraint