开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,[点击查看活动详情]
四、DDL语句
DDL包括:create drop alter
(一)表的创建(建表)
1.语法格式
create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型
);
表名:建议以t_ 或者 tbl_开始,可读性强。见名知意。
字段名:见名知意。 表名和字段名都属于标识符。
2.mysql中的数据类型
很多数据类型,我们只需要掌握一些常见的数据类型即可。
(1)varchar(最长255)
可变长度的字符串 比较智能,节省空间。 会根据实际的数据长度动态分配空间。
优点:节省空间 缺点:需要动态分配空间,速度慢。
(2)char(最长255)
定长字符串 不管实际的数据长度是多少。 分配固定长度的空间去存储数据。 使用不恰当的时候,可能会导致空间的浪费。
优点:不需要动态分配空间,速度快。 缺点:使用不当可能会导致空间的浪费。
- varchar 和 char 我们应该怎么选择? 性别字段你选什么?因为性别是固定长度的字符串,所以选择char。 姓名字段你选什么?每一个人的名字长度不同,所以选择varchar。
(3)int(最长11)
数字中的整数型。等同于java的int。
(4)bigint
数字中的长整型。等同于java中的long。
(5)float
单精度浮点型数据
(6)double
双精度浮点型数据
(7)date
短日期类型
(8)datetime
长日期类型
-
date和datetime两个类型的区别? date是短日期:只包括年月日信息。 datetime是长日期:包括年月日时分秒信息。 mysql短日期默认格式:%Y-%m-%d mysql长日期默认格式:%Y-%m-%d %h:%i:%s
(9)clob
字符大对象 最多可以存储4G的字符串。 比如:存储一篇文章,存储一个说明。 超过255个字符的都要采用CLOB字符大对象来存储。 Character Large OBject:CLOB
(10)blob
二进制大对象 Binary Large OBject 专门用来存储图片、声音、视频等流媒体数据。 往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等, 你需要使用IO流才行
3.创建一个学生表
学号、姓名、年龄、性别、邮箱地址
create table t_student(
no int,
name varchar(32),
sex char(1),
age int(3),
email varchar(255)
);
4.给字段设置默认值
create table t_student(
no int,
name varchar(32),
sex char(1) default '男', #使用default设置默认值
age int(3),
email varchar(255)
);
5.快速创建表(了解)
原理:将一个查询结果当做一张表新建 这个可以完成表的快速复制 表创建出来,同时表中的数据也存在了
create table emp2 as select * from emp; #as可写可不写
(二)表的删除
1.语法格式
drop table 表名;
2.注意事项
当这张表不存在的话会报错!
所以将删表格式改为:
drop table if exists 表名;
(三)对表结构的增删改
- 什么是对表结构的修改? 添加一个字段,删除一个字段,修改一个字段!!
第一:在实际的开发中,需求一旦确定后,表一旦设计好之后,很少的进行表结构的修改。因为开发进行中的时候,修改表结构,成本比较高。修改表的结构,对应的java代码就需要进行大量的修改。成本是比较高的。这个责任应该由设计人员来承担!
第二:由于修改表结构的操作很少,所以我们不需要掌握,如果有一天真的要修改表结构,你可以使用工具!
修改表结构的操作是不许需要写到java程序中的。实际上也不是java程序员的范畴
- 对表结构的修改需要使用:alter
修改表名
alter table goods2 rename to shop_db.goods2;
字段操作
alter添加字段在指定位置
ALTER TABLE goods add tax int(10) AFTER price;
alter删除字段
ALTER TABLE goods drop tax;
alter修改字段类型及名称
如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
alter table goods modify c varchar(10);
使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型
alter table goods change tax tax1 bigint
alter修改数据库字符集
alter database 数据库名 character set utf8;
alter修改表字符集
ALTER TABLE 表名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
alter修改列字符集
ALTER TABLE 表名 CHANGE 列名 列名 VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
(四)约束(非常重要)
1.概述
-
什么是约束?
约束对应的英语单词: constraint 在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性!
-
约束的作用就是为了保证:表中的数据有效!
2.约束的分类
非空约束:not null 唯一性约束: unique 主键约束: primary key (简称PK) 外键约束:foreign key(简称FK) 检查约束:check(mysql不支持,oracle支持)
3.非空约束:not null
非空约束not null约束的字段不能为NULL
当你插入数据的时候,如果你插入的数据的字段是非空的,你就必须要插入这个字段的数据,否则的就会报错。
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255) not null # not null只有列级约束,没有表级约束!
);
4.唯一性约束: unique
唯一性约束unique约束的字段不能重复,但是可以为NULL。
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255) unique,
email varchar(255)
);
insert into t_vip(id) values(1); # name字段虽然被unique约束了,但是可以为NULL
insert into t_vip(id) values(2);
-
新需求:name和email两个字段联合起来具有唯一性 以下这样的数据是符合我“新需求”的:
insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com'); insert into t_vip(id,name,email) values(2,'zhangsan','zhangsan@sina.com'); insert into t_vip(id,name,email) values(2,'sada','zhangsan@sina.com');如何做到联合唯一约束?
drop table if exists t_vip; create table t_vip( id int, name varchar(255), email varchar(255), unique(name,email) # 约束没有添加在列的后面,这种约束被称为表级约束。 );
-
什么时候使用表级约束呢? 需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束。
-
unique和not null可以联合吗?
在mysql当中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段。 在oracle中不是这样的
5.主键约束: primary key
简称:PK
-
主键约束的相关术语?
主键约束:就是一种约束。 主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段 主键值:主键字段中的每一个值都叫做:主键值。
-
什么是主键?有啥用?
主键值是每一行记录的唯一标识。 主键值是每一行记录的身份证号!!!
-
记住:任何一张表都应该有主键,没有主键,表无效!!
-
**主键的特征:not null + unique(**主键值不能是NULL,同时也不能重复!)
-
怎么给一张表添加主键约束呢?
drop table if exists t_vip; # 1个字段做主键,叫做:单一主键 create table t_vip( id int primary key, #列级约束 name varchar(255) ); -
可以这样添加主键吗,使用表级约束?
drop table if exists t_vip; create table t_vip( id int primary key, #列级约束 name varchar(255), primary key(id) ); -
表级约束主要是给多个字段联合起来添加约束
drop table if exists t_vip; // id和name联合起来做主键:复合主键!!!! create table t_vip( id int, name varchar(255), email varchar(255), primary key(id,name) );在实际开发中不建议使用:复合主键。建议使用单一主键! 因为主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主键可以做到。 复合主键比较复杂,不建议使用!!!
-
一张表只能添加一个主键
-
主键值建议使用: int bigint char 等类型。
不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的!
-
主键除了:单一主键和复合主键之外,还可以这样进行分类: 自然主键:主键值是一个自然数,和业务没关系。 业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!
-
在实际开发中使用业务主键多,还是使用自然主键多一些? 自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。 业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候, 可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。
-
在mysql当中,有一种机制,可以帮助我们自动维护一个主键值
drop table if exists t_vip; create table t_vip( id int primary key auto_increment, //auto_increment表示自增,从1开始,以1递增! name varchar(255) );
6.外键约束:foreign key
-
外键约束涉及到的相关术语: 外键约束:一种约束( foreign key) 外键字段:该字段上添加了外键约束 外键值:外键字段当中的每一个值。
-
外键约束的作用
但第一张表的字段没有任何约束的时候,可能会导致数据无效,原本cno只能取100,101但可能出现一个102,所以为了保证cno字段都是第二张表中的cno的100和101,需要给cno字段添加外键约束 那么cno字段就是外键字段,cno字段中的每一个值都是外键值
-
当使用了外键约束的时候两张表就有了父子关系,被引用的是父表,引用的是子表
-
删除的顺序:先删子表再删父表
-
创建表的顺序:先创建父表,再创建子表
-
删除数据的顺序:先删子,再删父
-
子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
不一定是主键,但至少具有unique约束
-
测试:外键可以为NULL吗?
-
外键值可以为NULL。