【数据库设计的三大范式】

1.第一范式(1NF First Normal Fromate):数据表中的每一列(字段),必须是不可拆分的最小单元。也就是确保每一列的原子性。
例如: userInfo: '山东省烟台市 13181621008'
=> userAds:'山东省烟台市'
tel:'13181621008'

2.第二范式(2NF):满足1NF后,要求:表中所有的列,都必须功能依赖于主键,而不能有任何一列与主键没有关系。(一张表值描述一件事情)

3.第三范式(3NF):满足2NF后,要求:表中的每一列都要与主键直接相关,而不是间接相关。(表中的每一列,只能依赖于主键)

例如:订单表中,需要有客户相关信息,在分离出客户表之后。订单表中,只需要有一个用户ID
即可。而不能有其他的客户信息。因为,其他的用户信息是直接关联于用户ID。而不是关联于订单ID。

【第二范式与第三范式的本质区别】
在于有没有分出两张表,第二范式是说一张表中包含了多种不同实体的属性,那么必须要分成多张表。第三范式要求,已经分好了多张表的话,那么,一张表中只能有另一张表中的ID(主键),而不能有其他的信息(其他的信息,一律使用主键在另一种查询)。

*/

USE mydb;

-- 创建表:
定义列:列名 数据类型 列定义关键字
常用的列定义关键字:
UNSIGNED:设置列为无符号列。只能设置类型为数字类型的列
AUTO_INCREMENT :设置自动增长列。 自动增长列必须是主键。

【主键】
1.主键的注意事项? ① 主键默认非空! ② 只有主键才能设置自动增长(主键不一定自动增长,自动增长必须是主键)
2.设置主键的方式? ① 在列定义时设置:id INT PRIMARY KEY
② 在列定义完成后设置: PRIMARY KEY(id)
UNIQUE:设置唯一性约束。该字段不能出现重复值。
NOT NULL:设置非空约束。该字段不能为空。
DEFAULT:设置默认值约束。hight DOUBLE(3,2) DEFAULT(1.2) height如果不输入默认1.2
FOREIGN KEY:设置外键约束。
【外键】
1、设置外键有哪些注意事项?
1、设置外键有哪些注意事项?
只有innoDB的数据库引擎支持外键。
修改my.ini文件设置default-storage-engine=INNODB
②外键与参照列的数据类型必须相同
③设置外键的字段必须要有索引。如果没有索引,设置外键时会自动生成一个索引

[数值型要求长度和无符号都相同,字符串要求类型相同,长度可以不同]

2、设置外键的语法?
[CONSTRAINT 外键名] FOREIGN KEY(外键字段)REFERENCES 参照表(参照字段)
[ON DELETE SET NULL ON UPDATE CASCADE] -- 设置参照完整性

3、外键约束的参照操作。
参照操作:当对参照表的参照字段进行删除或更新时,外键表中的外键如何应对。
参照操作可选值:DESTRTCT 拒绝参照表删除或更新参照字段
NO ACTION 与 RESTRICT相同,但这个指令只在MySQL生效
CASCADE 删除或更新参照表的参照字段时,外键表的记录同步删除更新
SET NULL 删除或更新参照表的参照字段时,外键表的外键设为NULL
*/

CREATE TABLE IF NOT EXISTS tb1(
-- IF NOT EXISTS 可以省略,省略后面重复创建报错。如果不省略,则创建时表是否已存在,如果表存在则不再执行创建
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255), -- name 是系统关键字,所以使用反引号``包裹
age SMALLINT UNIQUE,
hight DOUBLE(3,2) DEFAULT(1.2)
-- PRIMARY KEY(id) ); DROP TABLE IF EXISTS CLASSES;
CREATE TABLE IF NOT EXISTS CLASSES(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
CLASSNAME VARCHAR(255) NOT NULL
); DROP TABLE IF EXISTS `USER`;
CREATE TABLE IF NOT EXISTS `USER`(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
CLSID INT UNSIGNED NOT NULL,
`NAME` VARCHAR(255) NOT NULL,
CONSTRAINT user_fk_classes FOREIGN KEY (clsid) REFERENCES classes(id) ); SHOW COLUMNS FROM CLASSES;
SHOW TABLES;

-- 显示表结构

SHOW COLUMNS FROM tb1;

-- 显示表的建表语句

SHOW CREATE TABLES TB1;

-- 删除表

DROP TABLE IF EXISTS tb1;

-- 修改表名 ALTER TABLE 旧表名 RENAME [TO] 新表名;

ALTER TABLE TB1 RENAME TB2;

-- 同时修改多表名 RENAME TABLE TB3 TO TB1[,`USER` TO USER1 ……];

RENAME TABLE TB3 TO TB1,`USER` TO USER1;

-- 修改字段 列
-- ALTER TABLE 表名 CHANGE 旧列名 新列名 列定义 [FIRST | AFTER 某一列]
-- FIRST 将这个字段调整为表格第一列 AFTER 某一列:将这个字段放到某一列后面

ALTER TABLE TB1 CHANGE `NAME` `USERNAME` VARCHAR(200) NOT NULL AFTER AGE;

-- MODIFY 只修改定义,不能改名

ALTER TABLE TB1 MODIFY `USERNAME` VARCHAR(200) NOT NULL AFTER AGE;

-- 删除表中某一列

ALTER TABLE TB1 DROP HEIGHT;

-- 新增一列 必须部分:ALTER TABLE tb1 ADD HEIGHT DOUBLE(8,2)

ALTER TABLE tb1 ADD HEIGHT DOUBLE(8,2) DEFAULT 1.2 AFTER AGE;

-- 新增多列 不能调整列的位置,只能插在最后。

ALTER TABLE TB1 ADD(
WEIGHT DOUBLE(3,2) UNSIGNED,
school VARCHAR(255)
)

-- 增加主键约束

ALTER TABLE tb1 ADD PRIMARY KEY(id);

-- 删除主键约束

ALTER TABLE tb1 DROP PRIMARY KEY;

-- 新增唯一性约束

ALTER TABLE TB1 ADD UNIQUE KEY (USERNAME);

-- 删除唯一性约束:由于创建唯一性约束会默认创建索引,所以删除时,需删除索引

ALTER TABLE TB1 DROP INDEX USERNAME;

-- 设置默认值约束

ALTER TABLE TB1 ALTER AGE SET DEFAULT 20;

-- 删除默认值约束

ALTER TABLE TB1 ALTER AGE DROP DEFAULT;

-- 设置外键约束 必选部分:ALTER TABLE tb1 ADD FOREIGN KEY (CLSID) REFERENCES CLASSES(ID)

ALTER TABLE tb1 ADD FOREIGN KEY (CLSID) REFERENCES CLASSES(ID) ON DELETE SET NULL ON UPDATE CASCADE;

-- 删除外键约束。由于创建外键时会默认

ALTER TABLE tb1 DROP FOREIGN KEY TB1_FK_CLASSES;

SHOW COLUMNS FROM TB1;

SHOW TABLES;

MySql三大范式与数据库设计和表创建常用语句的更多相关文章

  1. mysql学习5:数据库设计

    mysql学习5:数据库设计 本文转载:https://blog.51cto.com/9291927/2087925:原创为天山老妖S 一.数据库设计简介 按照规范设计,将数据库的设计过程分为六个阶段 ...

  2. mysql查看当前所有数据库中的表大小和元信息information_schema

    查看所有mysql数据库表和索引大小 mysql查看当前所有的数据库和索引大小 ,),' mb') as data_size, concat(,),'mb') as index_size from i ...

  3. C#:CodeSmith根据数据库中的表创建C#数据模型Model + 因为没有钱买正版,所以附加自己写的小代码

    对于C#面向对象的思想,我们习惯于将数据库中的表创建对应的数据模型: 但假如数据表很多时,我们手动增加模型类会显得很浪费时间: 这个时候有些人会用微软提供的EntityFrameWork,这个框架很强 ...

  4. MySQL数据库的设计和表创建

    首先,我们使用Navicat Premium编辑器创建一个用户,同时设置用户权限,MySQL默认有一个root用户,拥有最高权限 下面,我们先创建一个用户: ①CREATE USER  'aaa'@' ...

  5. JavaSE基础篇—MySQL三大范式—数据库设计规范

    1.概   念     范式是一种符合设计要求的总结,要想设计一个结构合理的关系型数据库,必须满足一定的范式.各个范式是以此嵌套包含的,范式越高,设计等级越高,在现实设计中也越难实现,一般数据库只要打 ...

  6. MySQL学习-数据库设计以及sql的进阶语句

    1.数据库设计 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步 在开发中有很多设计数据库的软件,常用的如power des ...

  7. MySQL 08章_数据库设计

    一. 关系模型与对象模型之间的对应关系 序号 关系模型:数据库 对象模型:java程序 1 数据表table 实体entity:特殊的java类 2 字段field 属性attribute/字段fie ...

  8. Mysql系列四:数据库分库分表基础理论

    一.数据处理分类 1. 海量数据处理,按照使用场景主要分为两种类型: 联机事务处理(OLTP) 面向交易的处理系统,其基本特征是原始数据可以立即传送到计算机中心进行处理,并在很短的时间内给出处理结果. ...

  9. MYSQL三大范式

    第一范式:确保每列的原子性. 第一范式是最基本的范式. 数据库表中的字段都是单一属性的,不可再分. 只要是关系数据库都满足第一范式 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子 ...

随机推荐

  1. 记录——excel导出lua工具(python实现)

    项目需要一个从excel导出lua配置表的工具,之前的工具是主程写的,效率极差,i7 CPU 一次全部导出要花掉1个多小时.匪夷所思的是,这么渣的效率,居然用了整整一年.当 然,中途有人反映效率差,主 ...

  2. IOS打包相关问题

    使用了AFNetworking框架,模拟器和真机运行都不报错,但是提交商店报错Unsupported Architecture. Your executable contains unsupporte ...

  3. elasticsearch系列(二) esrally压测

    环境准备 linux centOS(工作环境) python3.4及以上 pip3 JDK8 git1.9及以上 gradle2.13级以上 准备过程中的坑 这些环境准备没什么太大问题,都是wget下 ...

  4. SSH免密码(日志三)

    上一篇:JDK安装以及安装过程中出现的问题(日志二) 原理,就是RSA加密,含有公钥和私钥,具体言之,用公钥来确认请求人是否是私钥的持有人. 1, 2, 3, 4, ssh免密码过程中遇到的问题:需要 ...

  5. Redis学习-复制

    Redis支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品.以 ...

  6. 精益IT组织与分享式领导

    精益IT组织       未来的组织将专注于同行业的产品或业务流--其他的一切,包括专家和管理者在内,都是为了让一线工作人员可以第一时间就做好,而又不会遇到任何麻烦.最大的制约不是技术:真正的挑战是变 ...

  7. Android N多窗口支持

    Android N 可以同时显示多个应用窗口. 在手机上,两个应用可以在"分屏"模式中左右并排或上下并排显示.例如,用户可以 在上面窗口聊QQ,下面窗口发送短信. 如图所示,两个a ...

  8. 利用gulp搭建简单服务器,gulp标准版

    var gulp = require('gulp'), autoprefixer = require('gulp-autoprefixer'), //自动添加css前缀 rename = requir ...

  9. iOS Regex匹配关键字并修改颜色

    引入第三方框架RegexKitLite /** * 根据传入的文字返回一个符合规则的富文本 * * @param title 匹配的文字 * * @return 创建的富文本 */ -(NSAttri ...

  10. Python yield用法

    yield 官方称是一种生成器,每每遇到这样包含这个关键字的代码,往往有些难读.def testyield(count): for x in xrange(count): print "te ...