之前对mysql数据库做了一个简要的讲解,也讲了怎么安装mysql数据库,从这篇开始正式进入对mysql知识的讲解。本专栏所有博客关于mysql的讲解都使用mysql的客户端工具:Navicat for MySQL。
表位于数据库之中,因此创建表前应该创建一个数据库用于储存表,或者选择一个已有的数据库。创建数据库使用CREATE DATABASE关键字。如图,创建一个名为school的数据库:
SQL语句写完之后点击运行就可以在数据库中执行,刷新左边的列表就可以看到刚才创建的school数据库。
DROP DATABASE school;
创建表有两种方式:
1.使用具有交互式创建和管理表的工具,比如Navicat 、sqlyog等;
2.表也可以直接用MySQL语句操纵(使用 CREATE TABLE语句)。
使用CREATE TABLE创建表,必须给出下列信息:
一个最基本的表至少要包含表名和列的细节,比如创建一个学生表:
CREATE TABLE t_student(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- id
student_name VARCHAR(20), -- 姓名
age INT(30), -- 年龄
sex VARCHAR(10), -- 性别
birthday DATE, -- 生日
tel VARCHAR(20)-- 电话号码
)ENGINE=InnoDB;
其中,PRIMARY KEY定义主键,也可以和列分开写,如下:
CREATE TABLE t_student(
id INT NOT NULL AUTO_INCREMENT, -- id
student_name VARCHAR(20), -- 姓名
age INT(30), -- 年龄
sex VARCHAR(10), -- 性别
birthday DATE, -- 生日
tel VARCHAR(20),-- 电话号码
PRIMARY KEY(id)
)ENGINE=InnoDB;
从上面可以看出:
注意:
CREATE TABLE IF NOT EXISTS t_student(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- id
student_name VARCHAR(20), -- 姓名
age INT(30), -- 年龄
sex VARCHAR(10), -- 性别
birthday DATE, -- 生日
tel VARCHAR(20)-- 电话号码
)ENGINE=InnoDB;
因为之前创建过t_student表,因此可以看到在数据库中并没有重新创建表,也没有报错。
允许NULL值的列也允许插入行时不给出该列的值,不允许NULL值的列不接受该列没有值的行。
每个表列或者是NULL列,或者是NOT NULL列,这种状态在创建时由表的定义给出。比如,刚才创建的学生表可以这样创建(id、姓名、年龄、性别不允许NULL,生日、电话允许NULL值):
CREATE TABLE IF NOT EXISTS t_student(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- id
student_name VARCHAR(20) NOT NULL, -- 姓名
age INT(30) NOT NULL, -- 年龄
sex VARCHAR(10) NOT NULL, -- 性别
birthday DATE NULL, -- 生日
tel VARCHAR(20) NULL-- 电话号码
)ENGINE=InnoDB;
主键值必须唯一。表中的每个行必须具有唯一的主键。如果主键使用单个列,则它的值必须唯一。如果使用多个列,则这些列的组合值必须唯一。
主键用 PRIMARY KEY(id) 来定义。如果使用多个列值作为主键,则多个列名之间用逗号分隔 ,比如:PRIMARY KEY(id1,id2,id3)
主键可以在创建表时定义,也可以在创建表之后定义
AUTO_INCREMENT告诉MySQL,本列每当增加一行时自动增量。也就是说每次执行一个INSERT操作时,MySQL自动对该列增量,给该列赋予下一个可用的值。这样给每个行分配一个唯一的id,从而可以用作主键值。
每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(如,通过使它成为主键)。
覆盖AUTO_INCREMENT:如果一个列被指定为AUTO_INCREMENT,你也可以在INSERT简单指定一个值,只要这个值是唯一的即可,该值将被用来替代自动生成的值。后续的增量将开始使用该手工插入的值。
如果在插入行时没有给出值,MySQL允许指定此时使用的默认值。默认值用CREATE TABLE语句的列定义中的DEFAULT关键字指定。比如创建班级表时,年级默认为一年级,则可以这样创建表:
CREATE TABLE IF NOT EXISTS t_class(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- 班级id
class_name VARCHAR(20) NOT NULL, -- 班级名
grade VARCHAR(10) NOT NULL DEFAULT '一年级' -- 所属年级
)ENGINE=InnoDB;
与其他DBMS一样,MySQL有一个具体管理和处理数据的内部引擎。创建表、插入数据、查询数据等都是由引擎来处理。
MySQL与其他DBMS不一样,它具有多种引擎,每种引擎具有各自不同的功能和特性,为不同的任务选择正确的引擎能够获得良好的功能和灵活性。
以下是几个比较常用的引擎:
- InnoDB是一个可靠的事物处理引擎,它不支持全文本搜索;
- MEMORY在功能等同于MyISAM,但由于数据储存在内存中,速度很快(特别适合于临时表);
- MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理。
注意:
引擎类型可以混用
外键不能跨引擎
使用 ALTER TABLE 语句可以更新表。
为了使用ALTER TABLE更改表结构,必须给出以下信息:
例如,给学生表增加一列(班级id):
ALTER TABLE t_student
ADD class_id INT;
执行该SQL语句后,可以看到t_student表增加了一列:
修改刚添加的列(使用关键字MODIFY):
ALTER TABLE t_student
MODIFY COLUMN class_id varchar(200);
执行该SQL语句后,可以看到class_id列的数据类型已经改变了:
删除刚添加的列(使用关键字DROP):
ALTER TABLE t_student
DROP COLUMN class_id ;
执行上面的SQL语句,然后重新打开t_student表,可以发现,class_id列已经没有了:
ALTER TABLE t_student
ADD FOREIGN KEY(class_id) REFERENCES t_class(id);
注意:由于刚才我们把t_student表的class_id列给删除了,直接执行以上SQL语句肯定会报错,需要先给t_student表添加class_id列。
重命名表使用关键字RENAME TABLE,例如重命名t_student表为t_student_rename:
RENAME TABLE t_student TO t_student_rename;
也可以重命名多个表,如下:
RENAME TABLE
t_student_rename TO t_student_rename_1,
t_class TO t_class_rename;
删除表使用DROP TABLE即可。比如,删除学生表:
DROP TABLE t_student_rename_1;
本文主要讲了添加、删除数据库,创建、修改、更新表以及给表添加外键约束,对数据库操作有了一个基本认识。