文章教程

8.6.1数据类型

9/17/2020 9:37:07 PM 人评论 次浏览

8.6 数据库表的管理

数据库表是存放数据的容器。使用SQL语句create table建立新的数据库表。

create table语句的语法格式:

create table table_name(

column_name1 数据类型 [约束条件],

column_namen 数据类型 [约束条件]

);

说明:table_name 为新建表的表名,column_name 为新建表的列名,数据类型稍后将进行讲解,约束条件分别为primary key、foreign key、unique、not null、check和default约束。

注意:在create table语句结尾处要使用“; ”符号结束该SQL语句。

8.6.1 数据类型

数据库表由一些列和一些行构成。数据库表中每一列都对应一个列名,也称为字段名,每个字段用于存储某种数据类型的数据。创建数据库表时,须为每个字段指定对应的数据类型。MySQL 共有 3 种数据类型,分别是数值类型、字符串类型和日期类型。其中数值类型分为整数类型和精确小数类型;字符串类型分为定长字符串类型、变长字符串类型和文本类型,MySQL中的字符串数据需用英文的单引号括起来,例如'victor';日期类型分为日期类型和日期时间类型,日期类型的数据是一个符合特殊格式的字符串数据。

1.数值类型之整数类型

在 SQL 语句中整数类型使用 int 表示,int 类型的数据最小值为-2147483648,最大值为2147483647。

2.数值类型之精确小数类型

在SQL语句中精确小数类型使用decimal(size,d)表示,size决定该小数最大位数,d用于设置小数点后的位数。例如 decimal (5,2)表示的数值范围是-999.99~999.99,而 decimal (5,0)表示-99999~99999的整数。

3.字符串类型之定长字符串类型

在SQL语句中定长字符串类型使用char(size)表示,括号中的size用来设置字符串的最大长度,size的取值范围是0~255,例如char(30)表示占用30个字符长度的字符串。

4.字符串类型之变长字符串类型

在SQL语句中变长字符串类型使用varchar(size)表示,最大长度由size设置,size的取值范围为0~65535。例如varchar (30)表示最多存储30个字符长度的字符串。同char(30)对比,varchar(30)只保存需要的字符数,而char(30)则必须占用30个字符空间。

5.字符串类型之文本类型

长度超过255的字符串可以使用变长字符串类型,长度超过65535的字符串可以使用文本类型。在SQL语句中文本类型使用text表示,能够存储更长长度的字符串。

6.日期类型之日期类型

在 SQL 语句中日期类型使用 date 表示,在数据库中,日期类型的数据是一个符合“YYYY-MM-DD”格式的字符串,例如′2008-08-08′。

7.日期类型之日期时间类型

在SQL语句中日期时间类型使用datetime表示,在数据库中,日期时间类型的数据是一个符合“YYYY-MM-DD hh:ii:ss”格式的字符串,例如′2008-08-08 08:08:08′。

figure_0167_0231MySQL提供了一个获得当前日期时间的函数now()。使用now()函数可以获得数据库服务器的当前时间;使用PHP中的date()函数获得的是WEB服务器的当前时间,数据库服务器和WEB服务器可以是两台不同的主机。

8.6.2 MySQL中的附加属性

MySQL还提供了一些附加属性用于修饰数据类型,例如NULL和auto_increment。

1.NULL

MySQL提供了附加属性NULL,NULL的意义为“没有值”或“不确定的值”。

2.auto_increment

如果需要为某个表的某个字段进行唯一编号以标识每条记录,在 MySQL 中可以将该字段设置为auto_increment(自动增长)。auto_increment属性的字段必须为整数类型的数据。auto_increment属性的字段值默认情况下从整数1开始递增,且步长为1。创建数据库表时可用“auto_increment=n”选项来指定自增的初始值。例如,下面的SQL语句为在student数据库中创建一个users表(用户表),该表的user_id字段从100开始递增。

use student;

create table users(

user_id int primary key auto_increment,

username varchar(15) not NULL,

password varchar(15) not NULL

)auto_increment=100;

auto_increment使用说明如下。

添加记录时,如果将NULL添加到一个auto_increment列,MySQL将自动生成下一个序列编号。如果为auto_increment列明确指定了一个数值,则会出现以下两种情况。

(1)如果添加的值与已有的编号重复,则会出现错误信息,因为 auto_increment 数据列的值必须是唯一的。

(2)如果添加的值大于已编号的值,则会把该值添加到数据列中,下一个编号将从这个新值开始递增,即编号不一定连续。

8.6.3 创建数据库表

使用“create table users”语句创建数据库表后,MySQL 数据库管理系统会自动在“C:\wamp\bin\mysql\mysql5.1.36\data\database_name\”目录中创建相关文件,实现对该数据库表的文件管理。

figure_0168_0232使用InnoDB存储引擎时,在student数据库中创建users表后,在student目录下只创建一个表文件users.frm与users表对应。使用MyISAM存储引擎时,在student数据库中创建 users 表后,在 student 目录下创建了 users.frm、users.MYD 和 users.MYI 3 个表文件与users表对应,如图8-20所示。

figure_0168_0233
图8-20 数据库表文件

使用 InnoDB 存储引擎创建数据库表时,当数据库表之间存在外键约束关系时,须先创建父表,再创建子表。对于学生管理系统,5 个表之间的父子关系如图8-21所示。

figure_0168_0234
图8-21 学生管理系统表之间的父子关系

另外,创建数据库表前还要为每个表的各个字段选择合适的数据类型以及约束条件,然后才能使用create table语句创建各数据库表。以学生管理系统为例,该系统的数据库表创建步骤如下。

(1)为每个表添加主键(primary key)约束,然后为各子表添加对应的外键(foreign key)约束,为个别表添加默认值(default)、非空(not NULL)、检查(check)和唯一性( unique )约束(添加各种约束的方法请参考student.sql脚本文件中的SQL语句)。

(2)在目录“C:\wamp\www\8”中创建 student.sql 脚本文件,存放数据库表的创建语句(按照先父表后子表的顺序创建各数据库表)。student.sql脚本文件如下。

use student;

create table classes(

class_id int auto_increment primary key,

class_no char(10) not NULL unique,

class_name char(20) not NULL

);

create table course(

course_id int auto_increment primary key,

course_no char(10) not NULL unique,

course_name char(20) not NULL

);

create table student(

student_id int auto_increment primary key,

student_no char(10) not NULL unique,

student_name char(10) not NULL,

class_id int,

constraint FK_student_class foreign key (class_id) references classes(class_id)

);

create table teacher(

teacher_id int auto_increment primary key,

teacher_no char(10) not NULL unique,

teacher_name char(10) not NULL,

class_id int unique,

constraint FK_teacher_class foreign key (class_id) references classes(class_id)

);

create table score(

score_id int auto_increment primary key,

student_id int not NULL,

course_id int not NULL,

grade int,

constraint FK_sore_student foreign key (student_id) references student(student_id),

constraint FK_score_course foreign key (course_id) references course(course_id)

);

(3)在命令窗口中执行“\. C:\wamp\www\sql\init.sql”命令,设置存储引擎为InnoDB,设置字符集为gbk。

(4)若没有student数据库,需要使用“create database student;”语句创建student数据库。

(5)在命令窗口中执行“\. C:\wamp\www\sql\student.sql”命令,创建student数据库各个数据库表。

student.sql脚本文件说明:在创建student表的SQL语句中,constraint FK_student_class foreign key (class_id) references classes(class_id)用于实现外键约束,其中 FK_student_class 为约束名, foreign key 指定约束类型为外键约束,(class_id) references classes(class_id)用于指定当前表中的class_id字段参照classes表的class_id字段,以此类推。

8.6.4 显示数据库表结构

在创建数据库表之后,在 MySQL 命令窗口中使用MySQL命令“show tables;”即可查看当前操作的数据库中所有的表名。该命令的执行结果如图8-22所示。

figure_0169_0235
图8-22 查看数据库中所有的表名

在 MySQL 命令窗口中使用 MySQL 命令“ describe table_name; ” 即 可 查 看 表 名 为table_name的表结构(describe关键字也可以简写为 desc),例如在 MySQL 命令窗口中输入命令“describe classes;”,查看classes表的表结构。该命令的执行结果如图8-23所示。

figure_0169_0236
图8-23 查看表结构

在MySQL命令窗口中也可以使用MySQL命令“show create table table_name;”查看创建表名为 table_name 的创建语句,从而查看表结构,包括存储引擎、字符集等信息。例如在 MySQL命令窗口中输入命令“show create table classes;”,即可查看classes表的表结构。该命令的执行结果如图8-24所示。

figure_0170_0237
图8-24 显示表结构创建语句

8.6.5 删除数据库表

在MySQL命令窗口中使用SQL语句“drop table table_name; ”即可删除表名为table_name的表。例如删除学生管理系统数据库student中的student表,使用“drop table student;”命令即可。删除数据库表后, MySQL 数据库管理系统会自动删除“C:\wamp\bin\mysql\mysql5.1.36\data\database_name\”目录中的表文件。因此数据库表一旦删除,保存在该数据库表中的记录及表结构都将全部被删除,所以该命令慎用!

另外,在进行数据库表删除操作的过程中,还要考虑到父表与子表间的关系,只有删除父表与子表间的外键约束关系,才可以成功删除父表。例如直接删除classes表时可能发生SQL语句运行错误,如图8-25所示。

figure_0170_0238
图8-25 删除父表失败

教程类别