第四篇:数据定义语言DDL
数据定义语言主要解决数据库的创建及删除和表格的结构的问题。其中,库和表格的操作都是创建,修改和删除。但是,为了更加清楚地显示表格的结构,这里还将对MySQL的常见数据形式以及常见约束进行说明。
Part 1:数据库的管理
数据库的主要操作依然是创建,删除,修改。
数据库的创建的语法如下:
creat database 数据库名;
备注:数据库名不可与已经有的数据库名重复。
为了解决这个问题,创建如下的格式:
creat database if not exists 数据库名;
例1:创建数据库books:creat database if not exists books;
数据库的修改:原则上一般不修改数据库,因为可能造成数据的丢失等问题,所以如果想修改的话,直接创建一个新的数据库即可。
数据库的删除的语法如下:
drop database 数据库名;
例2:删除数据库books:
drop database books;
Part 2:常见的数据类型
这一部分主要总结数据库的常见的数据类型,为表的结构打下基础。常见的数据类型主要包括以下几种:
- 数值型:整型+小数型
- 字符型
- 日期型
第一部分:数值型
数值型包括整型和小数型。先从整型说起。
tinyint 1个字节
smallint 2个字节
mediumint 3个字节
int 4个字节
bigint 8个字节
备注:
- 一般情况下,用int足够应对对整数的要求;如果数值超过了最大长度,那么就会将这个数值设置为临界值。
- 在创建表格时,设置的int的不同类型,都是有符号的数字,也就是可以表示负数;如果需要设置为无符号的数字的话,需要在不同类型的int后加上关键字unsigned.
- 一般int的长度会根据上面的不同类型来默认设置,如果需要强制设置长度的话,使用int(6)这种格式进行设置,其中6表示这种类型想要设置的长度。
- 如果需要在表格中设置定宽的values的话,需要在int后unsigned前加入zerofill这个关键字。
小数型:
小数型包含两种:浮点型和定点型。
浮点型:float(M,D), double(M,D)
其中,D表示小数点后面的小数的宽度,如果不够,补0;如果超过,则四舍五入;
M表示整数+小数的总长度,如果不写M和D的时候,插入什么都行;
定点型:dec(M,D),decimal(M,D)
其中,D表示小数点后面的小数的宽度,如果不够,补0;如果超过,则报错;
M表示整数+小数的总长度,如果不写M和D的时候,M默认为10,D默认为0;
第二部分:字符型
较短的字符型采用char和varchar进行保存,较长的字符型数据使用text和blob进行保存。需要注意的是,blob保存的是2进制的数据。
1.char(M)表示长度为M个字符数的字符型,M的取值可以为1-255;
2.varchar(M)表示长度为M个字符数的字符型,M的取值可以为1-255;
备注:char和varchar的区别在于varchar可以灵活调用,使用M以内的任意长度的字符型,比较省空间;char设置的M个长度,调用的就是M长度的空间,不够灵活。此外,varchar()中的M不可省略,char()中的M可以省略,默认值为1.
3.enum()用于保存枚举;
4.set()用于保存集合。
第三部分:日期型
MySQL要求日期型的变量用单引号’引起来。
日期型主要有以下几种:
- date, 使用4个字节, 最小时间:1000-01-01, 最大时间:9999-12-31;
- datetime, 使用8个字节,最小时间:1000-01-01 00:00:00,最大时间:9999-12-31 23:59:59;
- timestamp, 使用4个字节,最小时间:19700101 080001, 最大时间:2038年的某个时刻;timestamp受时区的影响;
- time,使用3个字节,最小时间:-838:59:59,最大时间:838:59:59
- year,使用1个字节,最小时间:1091,最大时间:2155;
Part 3:常见的约束总结
为了保证表格中的数据的稳定性和有效性,这里创建了约束的做法。
约束可以分为以下6种:
- 非空约束:该字段名下必须有内容;
- 默认约束:该字段名存在默认值;
- 主键约束:该字段名下的值不可以为空,并且不能重复;
- 唯一约束:该字段名下的值可以为空,但是不能重复;
- 检查约束:MySQL中不支持;
- 外键约束:限制两个表之间的关系,用于引用对方表格中的某些信息;
添加约束的时机:
- 创建表格时;
- 修改表格时;
按照添加的约束的作用范围可以分为:
- 列级约束:都可以,但是外键约束无效果;
- 表级约束:不可以加非空约束和默认约束,其余约束可以写;
备注:列级约束主要写在字段名之后即可,表级约束写在所有的列级约束之后,用于关联不同表格之间的关系;
类型1:创建表格时添加列级约束
例3:在学生数据库student中创建表stuinfo:
creat database student;
use student;
creat table stuinfo(
id int primary key, # 其中id表示学号,由于学号不能是重复,也不能缺省,定义学号为主键约束;
stuName varchar(20) not null; # 其中stuName表示学生的姓名,由于不能缺省,可以重复,所以为非空约束;
gender char(1) check(gender = '男' or gender = '女'), # 其中性别是只有两种选项的字符,所以可以设置为检查约束;
seat_id int unique, #其中seat_id表示座位号,是不可重复,但是可以空缺的,所以设置为唯一性约束;
major_id int references major(id) # 其中major_id表示专业号码,类型为int,需要借助于专业表major来判断具体是什么单位;
);
备注:创建表格的时候,最后一行不需要加,号;
类型2:创建表格时添加表级约束
例4:在学生数据库student中创建表stuinfo:
creat database student;
use student;
creat table stuinfo(
id int,
stuName varchar(20),
gender char(1),
seat_id int,
major_id int,
# 下面添加表级约束
constraint pk primary key(id),
constraint uq unique(seat_id),
constraint ck check(gender = '男' or gender = '女'),
constraint fk_stuinfo_major foreign key(majorid) references major(id)
);
类型3:修改表格的时候添加列级约束
修改表格的时候,添加列级约束的语法如下:
alter table 表名 modify column 字段名 约束类型;
例5:将学生信息表stuinfo中学生姓名stuName修改为非空约束:
alter table stuinfo modify column stuName varchar(20) not null;
例6:将学生信息表stuinfo中学生年龄age修改为默认约束,默认18岁:
alter table stuinfo modify column age int default 18;
例7:将学生信息表stuinfo中学生学号id修改为主键约束:
alter table stuinfo modify column id int primary key;
例8:将学生信息表stuinfo中学生座位号seat_id修改为唯一约束:
alter table stuinfo modify column seat_id int unique;
备注:修改表格时,只能添加这4种表级约束;
类型4:修改表格的时候添加表级约束
修改表格的时候,添加表级约束的语法如下:
alter table 表名 modify add constraint 约束名 约束类型(字段名);
例9: 将学生信息表stuinfo中学生学号id修改为主键约束:
alter table stuinfo add primary key(id);
例10:将学生信息表stuinfo中学生座位号seat_id修改为唯一约束:
alter table stuinfo add unique(seat_id);
例11:将学生信息表stuinfo中学生专业号major_id修改为外键约束:
alter table stuinfo add foreign key(major_id) references major(id);
补充:删除约束指的是,将约束变为之前的样子即可,就是上述添加约束的逆过程。
例12:删除学生信息表stuinfo中学生姓名stuName的非空约束:
alter table stuinfo modify column stuName varchar(20) null;
例13:删除学生信息表stuinfo中学生年龄age的默认约束:
alter table stuinfo modify column age int;
例14:删除学生信息表stuinfo中学生学号id的主键约束:
alter table stuinfo drop primary key;
例15:删除学生信息表stuinfo中学生座位号seat_id的唯一约束:
alter table stuinfo drop index seat_id;
例16:删除学生信息表stuinfo中学生专业号major_id的外键约束:
alter table stuinfo drop foreign key majpr_id;
备注:主键和唯一键的区别:
主键是唯一的,不可以为空,每个表格中至多1个,可以组合,但不推荐;
唯一键是唯一的,但是可以空,每个表格中可以有很多个,可以组合,但不推荐。
Part 4:表格的管理
类似于数据库的管理,表格的管理主要是添加,修改,删除,不过还多了一个复制。
表格的添加
表格的创建的语法结构如下:
creat table 表名(
字段名 字段的类型 字段的约束,
字段名 字段的类型 字段的约束,
…
);
例17: 创建一个表book:
create table book(
id int,
bname varchar(20),
author_id int,
publish_date Datetime
);
表格的修改
类型1:修改字段名
语法:alter table 表名 change column 旧字段名 新字段名 类型;
备注:由于有了类型,这个语法也可以更新字段的类型。
例18:将表格book中的发布日期修改为pub_date:alter table book change column publish_date pub_date;
类型2:修改字段的类型或者约束
语法:alter table 表名 modify column 字段名 类型名;
例19:将表格book中的发布日期publish_date的类型修改为日期戳:
alter table book modify column publish_date timestamp;
类型3:添加新字段
语法:alter table 表名 add column 字段名 类型名;
例20:在表格book中添加新的字段price,类型为double;
alter table book add column price double;
类型4:删除字段
语法:alter table 表名 drop column 字段名;
例21:删除表格book中的字段price:
alter table book drop column price;
类型5:修改表名
语法:alter table 旧表名 rename to 新表名;
例22:将表格book改名为books:
alter table book rename to books;
表格的删除
语法:drop table if exists 表名;
表格的复制
表格的复制存在两种:
- 表格结构的复制;
- 表格结构+内容的复制;
表格结构的复制的语法:
create table 新表名 like 旧表名;
这种复制只有表格的架构,没有表格的内容;
表格内容+结构的复制语法:
create table 新表名 select * from 旧表名;
这种复制方法能够将旧表格的所有内容都复制过来。
复制表格结构+部分内容的语法:
create table 新表名 select * from 旧表名 where 筛选条件;
先筛选后复制。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!