DDL创建数据库,表以及约束(极客时间学习笔记)
DDL
DDL是DBMS的核心组件,是SQL的重要组成部分. DDL的正确性和稳定性是整个SQL发型的重要基础.
DDL的基础语法及设计工具
DDL的英文是Data Definition Language,也就是数据定义语言.定义了数据库的结构和数据表的结构.常用的功能急救室增删改,对应的命令分别是CREATE、DROP和ALTER.
- 对数据库进行定义
CREATE DATABASE nba; // 创建名为nba的数据库
DROP DATABASE nba; // 删除名为nba的数据库
- 对数据表进行定义
CREATE TABLE table_name; // 创建表,table_name指表名
创建表的结构呢? 举个实际的例子, 我们创建一个球员表, 表名为player, 里面有两个字段, 一个是player_id, 它是int类型,另一个是player_name字段是varchar(255)类型, 两个字段都不能为空, 并且player_id是递增的.
接下来创建表的语句这么就是:
CREATE TABLE player(
player_id int(11) NOT NULL AUTO_INCREMENT,
player_name varchar(255) NOT NULL
);
注意的是每个字段定义的语句最后使用 , 作为结束符, 最后一个字段的定义结束之后没有逗号的 , 并且语句最后是以 ; 结尾的. 数据类型中int(11)代表整数类型, 显示长度是11位, 括号中的参数11代表的是最大有效显示长度, 与类型包含的数值大小无关. varchar(255)代表的是最大长度为255的可变字符串类型. NOT NULL表名整个字段不能为空值,是一种数据约束. AUTO_INCREMENT代表主键自动增长.(一般情况下使用可视化工具类创建和操作数据库和数据库表,比如Navicat)
接下来针对player表,设计下面字段:
其中player_id是数据表player的主键, 且自动增长, 也就是player_id会从1开始, 然后每次加一, 不必为它赋值. player_id、team_id、player_name这三个字段均不为空, height字段可以为空.
使用Navicat工具创建表并导出的SQL文件如下所示:
DROP TABLE IF EXISTS `player`;
CREATE TABLE `player`(
`player_id` int(11) NOT NULL AUTO_INCREMENT,
`team_id` int(11) NOT NULL,
`team_name` varchar(255) CHARACTER SET utf8 collate utf8_general_ci NOT NULL ,
`height` float(3,2) NULL DEFAULT0.00,
PRIMARY KEY(`player_id`) USING BTREE,
UNIQUE INDEX `player_name`(`player_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
可以看到整个SQL文件中的DDL处理, 首先删除player表(如果数据库中存在该表的话), 然后再创建player表, 里面的字段名和表名都使用了反引号,这是为了避免名称与MYSQL保留字段相同,对数据库表和字段名都加上反引号.
其中player_name字段的字符集是utf8, 排序规则是utf8_general_ci, 代表对大小写不敏感, 如果设置为utf8_bin, 表示对大小写敏感.
因为player_id设置为了主键, 所以在DDL中使用PRIMARY KEY进行规定,同时索引方法采用BTREE.
对player_name字段进行索引, 在设置索引时, 可以设置UNIQUE INDEX(唯一索引), 也可以设置为其它索引方式, 比如NORMAL INDEX(普通索引), 这里我们采用UNIQUE INDEX. 唯一索引和普通索引的区别在于对字段进行了唯一性约束. 在索引方式上, 可以选择BTREE和HASH, 这里采用BTREE方法进行索引.
整个数据表的存储规则采用InnoDB, 是MYSQL5.5之后的默认存储引擎, 将字符集设置为utf8, 排序规则设置为utf8_general_ci, 行格式为Dynamic, 就可以定义数据表的最后约定了:
ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
修改表结构
创建完表之后, 可以对表结构进行修改, 使用DDL命令来完成.
- 添加字段
ALTER TABLE player ADD (age int(11));
- 修改字段名, 将age字段改成player_age
ALTER TABLE player RENAME COLUMN age to player_age;
- 修改字段的数据类型
ALTER TABLE player MODIFT (player_age float(3,1));
- 删除字段, 删除刚才添加的player_age字段
ALTER TABLE player DROP CLOUMN player_age;
数据表的常见约束
在创建数据表的时候, 会对字段进行约束, 约束的目的在于保证RDBMS里面的数据的准确性和一致性.
- 主键约束
主键起的作用是唯一标识一条记录, 不能重复, 不能为空, 即UNIQUE + NOT NULL. 一个数据表的主键只能有一个. 但是主键可以是一个字段, 也可以是多个字段符合组成. 上面的player_id就是主键.
- 外键约束
外键起的作用是确保表与表之间引用的完整性. 一个表中的外键对应了另外一张表中的主键. 外键可以重复并且可以为空. 比如player_id是player表的主键,如果想设置一个球员比分表player_score, 可以再player_score中设置player_id为外键,关联到player表.
- 唯一约束
唯一约束就是表明字段在表中的数值唯一, 主要是对除主键以外的其他字段(主键自带数值唯一BUFF). 上面对player_name进行了唯一性约束,也就是说球员的姓名不能相同. 注意的是唯一性约束和普通索引(NORMAL INDEX)之间的区别: 唯一性约束相当于创建了一个约束和普通索引, 目的是保证字段的正确性, 而普通索引只是提升数据检索的速度, 并不对字段的唯一性进行约束.
- NOT NULL约束
对字段定义了NOT NULL, 表明字段不能为空, 必须有取值.
- DEFAULT
表明字段的默认值, 如果在插入数据的时候该字段没有取值, 就设置为默认值.
- CHECK约束
用来检查特定字段取值范围的有效性, CHECK约束的结果不能为FALSE.
设计数据表的原则
"三少一多的原则":
- 数据表的个数越少越好
RDBMS的核心在于对实体和联系的定义, 也就是E-R图(Entity Relation Diagram), 数据表越少, 说明实体和联系设计得越简洁, 即方便理解有方便操作.
- 数据表中的字段个数越少越好
字段个数越多, 数据冗余的可能性越大. 设置字段个数少的前提是各个字段相互独立, 而不是某个字段的取值可以由其它字段计算出来. 当然字段个数少是相对的, 通常会在数据冗余和检索效率中进行平衡.
- 数据表中联合主键的字段个数越少越好
设置主键是为了确定唯一性, 当一个字段无法确定唯一性, 就需要采用联合主键的方式. 联合主键中的字段越多, 占用的所以索引空间越大, 会加大理解难度, 会增加运行时间和索引空间.
- 使用主键和外键越多越好
数据库的设计实际上就是定义各种表, 一级各种字段间的关系, 关系越多, 证明实体之间的冗余度越低, 利用度越高, 这样做的好处在于不仅保证数据表之间的独立性, 还能提升相互之间的关联使用率. (不过在我现在的公司, 基本上没有使用外键, 不知道是因为影响效率还是什么, 外键的意义起不到作用)
作者的意思是大型项目中后期,可以采用业务层来实现,取消外键提高效率。不过在SQL学习之初,包括在系统最初设计的时候,还是建议你采用规范的数据库设计,也就是采用外键来对数据表进行约束。因为这样可以建立一个强一致性,可靠性高的数据库结构,也不需要在业务层来实现过多的检查。当然在项目后期,业务量增大的情况下,你需要更多考虑到数据库性能问题,可以取消外键的约束,转移到业务层来实现。而且在大型互联网项目中,考虑到分库分表的情况,也会降低外键的使用。
建议是 不过在SQL学习,以及项目早期,还是建议你使用外键。在项目后期,你可以分析有哪些外键造成了过多的性能消耗。一般遵循2/8原则,会有20%的外键造成80%的资源效率,你可以只把这20%的外键进行开放,采用业务层逻辑来进行实现,当然你需要保证业务层的实现没有错误。不同阶段,考虑的问题不同。当用户和业务量增大的时候,对于大型互联网应用,也会通过减少外键的使用,来减低死锁发生的概率,提高并发处理能力。
DDL创建数据库,表以及约束(极客时间学习笔记)的更多相关文章
- SQL的概念与发展 - 极客时间学习笔记
了解SQL SQL的两个重要标准是SQL92和SQL99. SQL语言的划分 DDL,也叫Data Definition Language,也就是数据定义语言,用来定义数据库对象,包括数据库.数据表和 ...
- MYSQL实战-------丁奇(极客时间)学习笔记
1.基础架构:一条sql查询语句是如何执行的? mysql> select * from T where ID=10: 2.基础架构:一条sql更新语句是如何执行的? mysql> upd ...
- MySQL的select(极客时间学习笔记)
查询语句 首先, 准备数据, 地址是: https://github.com/cystanford/sql_heros_data, 除了id以外, 24个字段的含义如下: 查询 查询分为单列查询, 多 ...
- Mysql中的sql是如何执行的 --- 极客时间学习笔记
MySQL中的SQL是如何执行的 MySQL是典型的C/S架构,也就是Client/Server架构,服务器端程序使用的mysqld.整体的MySQL流程如下图所示: MySQL是有三层组成: 连接层 ...
- java并发编程实践——王宝令(极客时间)学习笔记
1.并发 分工:如何高效地拆解任务并分配给线程 同步:线程之间如何协作 互斥:保证同一时刻只允许一个线程访问共享资源 Fork/Join 框架就是一种分工模式,CountDownLatch 就是一种典 ...
- MySQL的过滤(极客时间学习笔记)
数据过滤 SQL的数据过滤, 可以减少不必要的数据行, 从而可以达到提升查询效率的效果. 比较运算符 在SQL中, 使用WHERE子句对条件进行筛选, 筛选的时候比较运算符是很重要. 上面的比较运算符 ...
- Mysql实战45讲 06讲全局锁和表锁:给表加个字段怎么有这么多阻碍 极客时间 读书笔记
Mysql实战45讲 极客时间 读书笔记 Mysql实战45讲 极客时间 读书笔记 笔记体会: 根据加锁范围:MySQL里面的锁可以分为:全局锁.表级锁.行级锁 一.全局锁:对整个数据库实例加锁.My ...
- Mysql实战45讲 05讲深入浅出索引(下)极客时间 读书笔记
极客时间 Mysql实战45讲 04讲深入浅出索引(下)极客时间 笔记体会: 回表:回到主键索引树搜索的过程,称为回表覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID fro ...
- mysql实战45讲 (三) 事务隔离:为什么你改了我还看不见 极客时间读书笔记
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱. 转账过程具体到程序里会有一系列的操作,比如查询余额 ...
随机推荐
- TypeScript 学习笔记(三)
类: 1.TypeScript 是面向对象的 JavaScript,类描述了创建的对象共同的属性和方法 2.类通过关键字 class 声明,使用 extends 关键字进行继承 3.在引用一个类成员时 ...
- openresty配置
目录 环境 wsl安装 openresty安装 openssl版本问题 Lua模块安装 openresty使用 nginx常用命令 nginx.conf 配置 lua 的一些坑 OpenResty缓存 ...
- Matplotlib基础 可视化绘图 学习笔记
简单的绘图 1.确定画布并画线 import matplotlib.pyplot as plt #静态绘图 fig = plt.figure() ax = fig.add_subplot(345) # ...
- 在Rust中使用C语言的库功能
主要是了解unsafe{}语法块的作用. #[repr(C)] #[derive(Copy, Clone)] #[derive(Debug)] struct Complex { re: f32, im ...
- jqs实现图片轮播--通过点击按钮来实现
<!-- 布局思路:一个大的div,中有一个ul.和一个箭头的div css样似描述: 整个盒子距离顶部100px,又水平居中 盒子的宽高为图片的实际宽高 由于每次都是看见了一张图片:有两种方式 ...
- 【tyvj1858】xlkxc(拉格朗日插值)
传送门 题意: 求\(\sum_{i=0}^n\sum_{j=1}^{a+id}\sum_{k=1}^{j}k^K,n,a,d\leq 10^9,K\leq 100\). 思路: 最右边这个和式为一个 ...
- you have new mail in /var/spool/mail/root !
今天开发的同事告诉我,他在登录系统时老是提示you have new mail in /var/spool/mail/root ! 我一猜就知道他们肯定又自己写定时任务了,这样的事已经发生过好几回了, ...
- c# 第29节 类
本节内容: 1:类是什么 2:声明类 3:类的使用 1:类是什么 2:声明类 在生产上的声明:如下操作 或者快捷操作 ctrl+shift+a 键 出现如下界面: 3:类的使用 using Sys ...
- 炫酷的CSS3响应式表单
原创YouTube@ Online Tutorials css代码: * { margin: 0; padding: 0; box-sizing: border-box; font-family: ' ...
- Python爬虫:
python中selenium操作下拉滚动条方法汇总 UI自动化中经常会遇到元素识别不到,找不到的问题,原因有很多,比如不在iframe里,xpath或id写错了等等:但有一种是在当前显示的页面元 ...