Data Definition Language(数据定义语言)

1、库的管理(create drop alter)

  • 什么是对表结构的修改?

    1. 添加一个字段,删除一个字段,修改一个字段!!!
  • 创建库

create database 【if not exists】 库名【 character set 字符集名】;

  • 修改库

alter database 库名 character set 字符集名;

  • 删除库

drop database 【if exists】 库名;

第一:在实际的开发中,需求一旦确定之后,表一旦设计好之后,很少的
进行表结构的修改。因为开发进行中的时候,修改表结构,成本比较高。
修改表的结构,对应的java代码就需要进行大量的修改。成本是比较高的。
这个责任应该由设计人员来承担!

  1. 第二:由于修改表结构的操作很少,所以我们不需要掌握,如果有一天<br /> 真的要修改表结构,你可以使用工具!!!!
  2. 修改表结构的操作是不需要写到java程序中的。实际上也不是java程序员的范畴。

2、约束(非常重要,五颗星*

2.1 什么是约束?

  • 约束对应的英语单词:constraint
  • 在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的

    完整性、有效性!!!

    约束的作用就是为了保证:表中的数据有效!!

    2.2 约束包括哪些?

    | not null | 非空约束 | 只有列级约束,没有表级约束! | | —- | —- | —- | | unique | 唯一性约束 | 字段不能重复,但是可以为NULL | | primary key (简称PK) | 主键约束 | not null + unique | | foreign key(简称FK) | 外键约束 | | | check | 检查约束 | mysql不支持,oracle支持 |

2.2.1 非空约束:not null

  1. 非空约束not null约束的字段不能为NULL
  1. drop table if exists t_vip;
  2. create table t_vip(
  3. id int,
  4. name varchar(255) not null // not null只有列级约束,没有表级约束!
  5. );
  6. insert into t_vip(id,name) values(1,'zhangsan');
  7. insert into t_vip(id,name) values(2,'lisi');
  8. insert into t_vip(id) values(3);
  9. //ERROR 1364 (HY000): Field 'name' doesn't have a default value

2.2.2 唯一性约束: unique

  1. 唯一性约束unique约束的字段不能重复,但是可以为NULL
  1. drop table if exists t_vip;
  2. create table t_vip(
  3. id int,
  4. name varchar(255) unique,
  5. email varchar(255)
  6. );
  7. insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');
  8. insert into t_vip(id,name,email) values(2,'lisi','lisi@123.com');
  9. insert into t_vip(id,name,email) values(3,'wangwu');
  1. 新需求:nameemail两个字段联合起来具有唯一性!!!!<br />错误方式
  1. drop table if exists t_vip;
  2. create table t_vip(
  3. id int,
  4. name varchar(255) unique, // 约束直接添加到列后面的,叫做列级约束。
  5. email varchar(255) unique
  6. );
  7. /*
  8. 这张表这样创建是不符合我以上“新需求”的。
  9. 这样创建表示:name具有唯一性,email具有唯一性。各自唯一。
  10. */

正确方式

  1. drop table if exists t_vip;
  2. create table t_vip(
  3. id int,
  4. name varchar(255),
  5. email varchar(255),
  6. unique(name,email) // 约束没有添加在列的后面,这种约束被称为表级约束。
  7. );

什么时候使用表级约束呢?
需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束。

unique 和not null可以联合吗?

  1. drop table if exists t_vip;
  2. create table t_vip(
  3. id int,
  4. name varchar(255) not null unique
  5. );

在mysql当中,如果一个字段同时被not null和unique约束的话,
该字段自动变成主键字段。(注意:oracle中不一样!)

  • insert into t_vip(id,name) values(1,’zhangsan’);
  • insert into t_vip(id,name) values(2,’zhangsan’); //错误了:name不能重复
  • insert into t_vip(id) values(2); //错误了:name不能为NULL。

2.2.3 主键约束(primary key,简称PK)

主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)
结论:一张表,主键约束只能添加1个。(主键只能有1个。)
方式一:

  1. drop table if exists t_vip;
  2. // 1个字段做主键,叫做:单一主键
  3. create table t_vip(
  4. id int primary key, //列级约束
  5. name varchar(255)
  6. );

方式二: 可以这样添加主键吗,使用表级约束

  1. drop table if exists t_vip;
  2. create table t_vip(
  3. id int,
  4. name varchar(255),
  5. primary key(id) // 表级约束
  6. );

复合主键

  1. drop table if exists t_vip;
  2. // id和name联合起来做主键:复合主键!!!!
  3. create table t_vip(
  4. id int,
  5. name varchar(255),
  6. email varchar(255),
  7. primary key(id,name)
  8. );
  1. 在实际开发中不建议使用:复合主键。建议使用单一主键!<br /> 因为主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主键可以做到。<br /> 复合主键比较复杂,不建议使用!!!<br />
  • 主键值建议使用:int、bigint、char、等类型。
  • 不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的!

主键的分类

主键除了:单一主键和复合主键之外,还可以这样进行分类?

自然主键 主键值是一个自然数,和业务没关系。
业务主键 主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!

在实际开发中使用业务主键多,还是使用自然主键多一些?

  • 自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。
  • 业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。

    auto_increment自增

    在mysql当中,有一种机制,可以帮助我们自动维护一个主键值?

    1. drop table if exists t_vip;
    2. create table t_vip(
    3. id int primary key auto_increment, //auto_increment表示自增,从1开始,以1递增!
    4. name varchar(255)
    5. );

    2.2.4 外键约束(foreign key,简称FK)非常重要五颗星*

    外键约束涉及到的相关术语:

  • 外键约束:一种约束(foreign key)

  • 外键字段:该字段上添加了外键约束
  • 外键值:外键字段当中的每一个值。

业务背景:

请设计数据库表,来描述“班级和学生”的信息?
第一种方案:班级和学生存储在一张表中???
t_student
no(pk) name classno classname
—————————————————————————————————————————
1 jack 100 北京市大兴区亦庄镇第二中学高三1班
2 lucy 100 北京市大兴区亦庄镇第二中学高三1班
3 lilei 100 北京市大兴区亦庄镇第二中学高三1班
4 hanmeimei 100 北京市大兴区亦庄镇第二中学高三1班
5 zhangsan 101 北京市大兴区亦庄镇第二中学高三2班
6 lisi 101 北京市大兴区亦庄镇第二中学高三2班
7 wangwu 101 北京市大兴区亦庄镇第二中学高三2班
8 zhaoliu 101 北京市大兴区亦庄镇第二中学高三2班
分析以上方案的缺点:数据冗余,空间浪费!!!!这个设计是比较失败的!
第二种方案:班级一张表、学生一张表??
t_class 班级表
classno(pk) classname
———————————————————————————
100 北京市大兴区亦庄镇第二中学高三1班
101 北京市大兴区亦庄镇第二中学高三1班

t_student 学生表
no(pk) name cno(FK引用t_class这张表的classno)
————————————————————————————————
1 jack 100
2 lucy 100
3 lilei 100
4 hanmeimei 100
5 zhangsan 101
6 lisi 101
7 wangwu 101
8 zhaoliu 101

当cno字段没有任何约束的时候,可能会导致数据无效。可能出现一个102,但是102班级不存在。
所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束。
那么:cno字段就是外键字段。cno字段中的每一个值都是外键值。
注意:t_class是父表 t_student是子表
- 删除表的顺序?先删子,再删父。
- 创建表的顺序?先创建父,再创建子。
- 删除数据的顺序?先删子,再删父。
- 插入数据的顺序?先插入父,再插入子。
思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
答案:不一定是主键,但至少具有unique约束。
测试:外键可以为NULL吗?外键值可以为NULL。