MySql三大范式与数据库设计和表创建常用语句

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

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;
时间: 2024-10-09 22:11:29

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

SQLServer数据库基础--E-R图、三大范式、数据库设计步骤

本书目标: 了解数据库的基本概念和范式 熟练使用SMSS.T-SQL实现建库.建表.加约束 掌握T-SQL编程,实现功能强大的查询 掌握创建索引.视图,快速访问数据库 熟悉掌握创建存储过程,实现复杂的业务规则 理解触发器的原理,掌握高级的约束 了解SQLServler安全管理 了解数据库的备份与恢复 本章目标: 了解数据库的基本概念 了解数据库设计的步骤 掌握绘制数据库E-R图 理解数据库三大范式 什么是数据库系统? 数据库系统(DBS)是一个以数据库为核心的完整的运行实体, 数据库的组成: 系

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

对于C#面向对象的思想,我们习惯于将数据库中的表创建对应的数据模型: 但假如数据表很多时,我们手动增加模型类会显得很浪费时间: 这个时候有些人会用微软提供的EntityFrameWork,这个框架很强大,编写代码效率也很高,但很由于性能差,在复杂查询的时候生成的sql脚本效率不是很高,所以有的时候不会去使用它: 这个时候就会有CodeSmith来协助我们去完成那些费时费力的工作: CodeSmith如何使用,网上也有很详细的介绍了,下面代码只是简单介绍 属性SourceDataBase是连接的数

MySQL(四)—— 数据库设计

一.多表之间的关系的分类 (一).一对一之间的关系 如:人和身份证 分析:一个人只有一个身份证,一个身份证只能对应一个人. (二).一对多(多对一)之间的关系 如:部门和员工 分析:一个部门有多个员工,一个员工只能有一个部门. (三).多对多之间的关系 如:学生和课程 分析:一个学生可以选择很多门课程,一个课程也可以被多个学生选择. 二.一对多(多对一)关系实现 如:部门和与员工 实现:在多的一方建立外键,指向一的一方的主键. 三.多对多关系实现 如:学生和课程 实现:多对多关系实现需要借助第三

MYSQL三大范式

第一范式:确保每列的原子性. 第一范式是最基本的范式. 数据库表中的字段都是单一属性的,不可再分. 只要是关系数据库都满足第一范式 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名.编号.地址.--)其中"地址"列还可以细分为国家.省.市.区等. 2.第二范式(确保表中的每列都和主键相关). 如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖于该主键,则满足第二范式. 例如:订单表(订单编号.产品编号.定购日期.价

Mysql第四天 数据库设计

不考虑主备.集群等方案,基于业务上的设计主要是表结构及表间关系的设计. 而关于表中字段主要是依据业务来进行定义,我们能够指定的大概有这么几项: 存储引擎 一般用InnoDB,特殊需求特殊选用 字符集和校验规则 特别说一下校验规则是指两个字符之间的比較规则, 比方A=a的话就是不区分大写和小写,会影响order by等. bin通常是区分大写和小写的, 一般用general 字段定义 字段怎么选取类型 索引 后面再说 特殊用途表 比方做缓存,汇总等 字段的数据类型选择 三个原则: 更小的数据类型.

数据库设计:表的设计命名的十个注意点

原文链接:http://www.cnblogs.com/netsql/archive/2010/05/04/1727323.html 1.表名一般以[模块名称_具体表名]来实现,同一个模块的前缀是一样的.(Oracle大小写敏感,在SQL中可以不用"_",因为可以用大小写一起的写法.这也是可以的) 2.表名称不应该取得太长(一般不超过三个英文单词,不推荐使用中文拼音,总的长度不要超过30个字符).表名使用英文的原因,有些项目有英文版的需要,或者这个项目是给外国做的时候,使用英文是基本的

Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解

一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 2. 解压mycat tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 3. 剪切mycat到/usr/local目录下

mysql 三大范式【转载】

第一范式(1NF,normal format):字段不能再分. 这是字段的原子性.例如:字段“学期时间”:2014-9-1,2015-1-15. 这个字段“学期时间”可以再分为“学期开始时间”,2014-9-1:和“学期结束时间”,2015-1-15. 第二范式(2NF):范式是递增的,要满足第二范式,必须满足第一范式!2NF要求字段对主键没有部分依赖! 先说部分,有部分说明主键是复合主键.来个彻底的解决办法就是,让主键不是复合主键,即让主键是一个字段! 再说依赖,依赖是通过一个字段能确定另一字

mysql 为某一数据库下所有表中添加相同字段

BEGIN  DECLARE s_tablename VARCHAR(100);  /*显示表的数据库中的所有表 SELECT table_name FROM information_schema.tables WHERE table_schema='databasename' Order by table_name ; */ #显示所有 DECLARE cur_table_structure CURSOR FOR  SELECT table_name  FROM INFORMATION_SCH