20150102--Mysql外键+增删改查-01

回顾

校对集:校对集必须事先设置好,修改无效

乱码问题:三码合一,通过php设置数据库和浏览器的编码

存储引擎:数据库数据的存储方式

数据类型:数值型,字符串型和时间日期型

数值型:整型,小数型(浮点和定点)

字符串型:定长,变长,文本,枚举和集合

时间日期型:时间日期,日期,时间,时间戳(以时间戳时间为起始单位的时间日期),年

列属性:null,default,primary key,auto_increment

列属性

注释

注释不是指普通的注释,让系统(服务器)自动的去忽略无效代码。真正的注释将一段用来描述字段文件保存到对应的数据表里,用于提示用户当前结构的情况。

SQL注释:让系统忽略

-- :两个中划线和一个空格,行注释,以后所有内容都可以忽略

#:也是单行注释

/**/:块注释

注释关键字:comment

语法:在数据类型之后comment ‘注释内容’;

注意:注释不分语言类型,都是为了方便别人和自己去维护代码。

唯一键

唯一键是一个索引,对应字段里面的数据应该具有唯一性。

存在:一个表主键也是用来保证数据的唯一性(对应的字段),但是一张表只能拥有一个主键,但是其他字段也有可能需要保证数据唯一性,唯一键就是为了解决该问题。

唯一键特点

1. 唯一键与主键类似,都是保证当前的数据具有唯一性

2. 唯一键不统计数据为空的字段(允许有空字段而且是多个)

3. 唯一键在表中可以使用多个

添加唯一键

唯一键关键字:unique key

1. 在字段之后使用关键字unique

2. 可以在所有的字段只用,使用unique key(字段列表);

3. 修改表结构

a) 修改字段(modify),在字段之后增加属性unique关键字

b) 增加唯一键:add unique key(字段列表)

使用唯一键

如果给唯一键字段添加不唯一的数据,那么就会报错。

唯一键不能修改,只能删除

删除唯一键

alter table 表名 drop index 索引名字; 删除唯一键

alter table 表名 drop primary key; 删除主键

alter table 表名 drop foreign key 外键名; 删除外键

查看索引名字

删除唯一键

伪主键

关系

自然界中的关系通过数据对应的模式进行分析之后,得出结果:可以大致分为三种,一对一,一堆多,多对多

一对多

一对多与多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系。

班级表(一表)

名称


教室


总人数


学科


PHP141115


A814


53


PHP


PHP140925


A806


55


PHP

学生表(多表)

学号


姓名


性别


年龄


Itcast0001


何权森



22


Itcast0002


朱红林



保密


Itcast0003


詹曼雪



保密


Itcast0004


刘星



28

将实体间的多对一的关系进行维护:在“多”表中,增加一个字段能够指向“一”表中,唯一字段。

学号


姓名


性别


年龄


班级名称


Itcast0001


何权森



22


PHP141115


Itcast0002


朱红林



保密


PHP141115


Itcast0003


詹曼雪



保密


PHP140925


Itcast0004


刘星



28


PHP140925

多对多

一个实体的数据对应另外一个实体的多个数据,另外实体的数据也同样对应当前实体的多个数据。

教师表(多)

姓名


性别


年龄


犬夜叉



300


戈薇



18

班级表(多)

名称


教室


总人数


学科


PHP141115


A814


53


PHP


PHP140925


A806


55


PHP

犬夜叉:教过PHP141115和PHP140925

PHP141115:被犬夜叉和戈薇教过

解决方案:创建一个中间表,专门用来维护多表之间的对应关系,通常是能够唯一标识出数据的字段(主键)

一对一

一个实体的数据对应另外一个实体的数据,一条对一条

学生表(内部关系)

姓名


性别


年龄


身高


政治面貌


家庭住址


紧急联系人


紧急联系人方式


婚姻情况


张无忌



20


175


党员


冰火岛


金毛狮王



未婚


周芷若



18


168


gcd


峨眉山


灭绝师太


飞鸽传书


未婚


赵敏



18


168


国名党


蒙古


王爷


号角


未婚


宋青书



22


178


党员


武当山


周芷若



未婚

为了提升操作的效率会主动的将一张表进行拆分,拆分成两张表:一张经常用于操作,另外一张很少操作。

常用信息

姓名


性别


年龄


身高


张无忌



20


175


周芷若



18


168


赵敏



18


168


宋青书



22


178

不常用信息

姓名


政治面貌


家庭住址


紧急联系人


紧急联系人方式


婚姻情况


张无忌


党员


冰火岛


金毛狮王



未婚


周芷若


gcd


峨眉山


灭绝师太


飞鸽传书


未婚


赵敏


国名党


蒙古


王爷


号角


未婚


宋青书


党员


武当山


周芷若



未婚

范式

规范的方式,指的是一套维护数据的方式

范式:Normal Format,简称NF,是数学中的一个概念。是为了解决一个数据之间的联系,同时还要保证数据最简化的内容。

范式一共分为六层:第一范式(1NF),第二范式…第六范式(6NF)

范式的严格程度是逐层递增,要满足后续的范式,必须先满足前面所有的范式。

数据库规范中引入的范式的概念,只引入到三层范式(3NF)。

1NF

第一范式:指数据库中表的设计(字段),字段在使用的过程中,不需要通过额外的方式对数据进行处理(拆分),要保证数据库中的字段必须拿出来就可以直接使用。1NF必须满足原子性。

讲师代课表

讲师


性别


班级


教室


代课时间


代课时间(开始,结束)


李东超


Male


php0226


D302


30天


2014-02-27,2014-05-05


李东超


Male


php0320


B206


30天


2014-03-21,2014-05-30


马浩洋


Male


php0320


B206


15天


2014-06-01,2014-06-20

如果在使用的过程中,需要额外的使用代课的起始时间,需要分别得到起始时间和结束时间。代课时间取出来需要对数据进行拆分,不符号1NF,不具有不可拆分性(原子性)

解决方案:将代课时间拆分成开始时间和结束时间

讲师


性别


班级


教室


代课时间


开始


结束


李东超


Male


php0226


D302


30天


2014-02-27


2014-05-05


李东超


Male


php0320


B206


30天


2014-03-21


2014-05-30


马浩洋


Male


php0320


B206


15天


2014-06-01


2014-06-20

满足第一范式很简单:将数据拆分成最小颗粒存储到数据库即可。

2NF

若要满足第二范式,必须先满足第一范式。

2NF,如果一个数据库中存在一个字段依赖主键的一部分,而不是整个主键。这个时候就存在部分依赖,第二范式不满足,需要解除部分依赖。

讲师带课表

讲师P


性别


班级P


教室


代课时间


开始


结束


李东超


Male


php0226


D302


30天


2014-02-27


2014-05-05


李东超


Male


php0320


B206


30天


2014-03-21


2014-05-30


马浩洋


Male


php0320


B206


15天


2014-06-01


2014-06-20

将主键由讲师和班级共同组建(复合主键),性别只依赖于讲师,教室依赖于班级

班级和性别依赖主键的一部分,存在部分依赖。

解决方案:取消复合主键,额外的增加一个逻辑主键

IDP


讲师


性别


班级


教室


代课时间


开始


结束


1


李东超


Male


php0226


D302


30天


2014-02-27


2014-05-05


2


李东超


Male


php0320


B206


30天


2014-03-21


2014-05-30


3


马浩洋


Male


php0320


B206


15天


2014-06-01


2014-06-20

第二范式:不让表中存在复合主键

3NF

要满足第三范式,必须满足第二范式。

指的是如果一个字段不依赖主键,而是依赖其他的字段的时候,那么就会形成传递依赖。一张表中的所有字段都应该依赖主键,而不是依赖主键以外的其他字段。如果存在依赖主键以外的字段,那就形成了传递依赖。第三范式要求取消传递依赖。

讲师带课表

IDP


讲师


性别


班级


教室


代课时间


开始


结束


1


李东超


Male


php0226


D302


30天


2014-02-27


2014-05-05


2


李东超


Male


php0320


B206


30天


2014-03-21


2014-05-30


3


马浩洋


Male


php0320


B206


15天


2014-06-01


2014-06-20

性别不依赖ID,只依赖讲师,而讲师依赖主键,形成了传递依赖。

解决方案:将形成传递依赖的字段,单独取出来,形成一个新的实体,然后在需要使用新实体的地方使用对应实体表中主键。

因为讲师代课表中不存在字段不依赖主键了,所以就不存在传递依赖。

数据库并没有强制要求数据表设计必须满足三范式。

逆规范化

明知设计不符合三范式,但是有时候会为了提高效率,会刻意的增加数据冗余。

IDP


讲师ID


班级ID


代课时间


开始


结束


1


李东超


10


30天


2014-02-27


2014-05-05


2


李东超


12


30天


2014-03-21


2014-05-30


3


马浩洋


12


15天


2014-06-01


2014-06-20

因为数据查询操作如果跨表的话会影响效率,有时候为了效率会增加必要的数据冗余(牺牲磁盘空间)

逆规范化其实本质是效率与空间利用率的博弈。

时间: 2024-07-28 13:26:47

20150102--Mysql外键+增删改查-01的相关文章

20150102--Mysql外键+增删改查-02

外键 外键:外面的键,前表中的某个字段与另外的表中的字段(主键)有一个对应的关系 外键关键字:foreign key,也是一种索引. 创建外键 外键和主键有点类似,但是不一样. 1. 在所有的字段之后,指定对应的外键. foreign key(字段名) references 表名(字段) 外键约束 外键的作用是用来维护两张表之间的关系,关系是用来限制表操作的. 父表(主表):被外键指向的表叫做主表 子表(从表):存在外键字段的表叫子表 1. 限制子表数据的插入:子表中的外键字段的值必须事先已经在

Sql中常用的创建表 约束 主外键 增删改查的语句

创建数据库 1 USE master; 2 GO 3 --日记数据库 4 create database DiaryBase 5 on 6 ( 7 name=DiaryBase_Dat,--逻辑名称 8 FILENAME='c:\DiaryBase.log', 9 size=10MB, 10 maxsize=50MB, 11 FILEGROWTH=5MB 12 ) 13 log on 14 ( 15 name=DiaryBase_Log, 16 FILENAME='c:\DiaryBase.md

java jdbc 连接mysql数据库 实现增删改查

好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的

Windows下安装MySQLdb, Python操作MySQL数据库的增删改查

这里的前提是windows上已经安装了MySQL数据库,且配置完毕,能正常建表能操作.在此基础上只需安装MySQL-python-1.2.4b4.win32-py2.7.exe就ok了,只有1M多.这个有点类似jdbc里的那个jar包. 下载链接:http://sourceforge.net/projects/mysql-python/ , 百度云盘 :http://pan.baidu.com/s/1dDgnfpR 密码:7bna 接着import MySQLdb就能使用了,下面给出测试代码:

【Mysql】Java中对Mysql数据库的增删改查、Java的System类

这部分也是所谓JDBC.网站数据源的内容,把名字弄得很高深似得,实际上只是Java中对Mysql数据库的增删改查的内容.非常简单,之前写了这么多Mysql的内容,没好好总结一下,实在是不应该.今天就实现一个Java中对Mysql数据库的增删改查,随便带点Java取出当前系统的系统名与系统时间的知识,完成一个还算有点意思的小例子. 一.基本目标 首先,在Mysql数据库中有一张名为testtable的空表,id为自增列,username,class都是文本列,但是class里面都存放数字,也就是整

MYSQL所有的增删改查等等语句,作为程序员的你,够用了

MYSQL的常用命令和增删改查语句和数据类型 连接命令:mysql -h[主机地址] -u[用户名] -p[用户密码]   创建数据库:create database [库名]   显示所有数据库: show databases;   打开数据库:use [库名]   当前选择的库状态:SELECT DATABASE();   创建数据表:CREATE TABLE [表名]([字段名] [字段类型]([字段要求]) [字段参数], ......);   显示数据表字段:describe 表名; 

mysql数据库的增删改查语句

连接命令:mysql -h[主机地址] -u[用户名] -p[用户密码] 创建数据库:create database [库名] 显示所有数据库: show databases; 打开数据库:use [库名] 当前选择的库状态:SELECT DATABASE(); 创建数据表:CREATE TABLE [表名]([字段名] [字段类型]([字段要求]) [字段参数], ......); 显示数据表字段:describe 表名; 当前库数据表结构:show tables; =============

mysql 命令行增删改查

1.mysql数据库的连接与关闭 连接数据库: mysql -h 服务器主机地址 -u 用户名 -p密码 关闭连接: 在任何时候输入exit或quit 2.创建新用户并授权 grant 权限 on 数据库.数据表 to 用户名@登录主机 identified by "密码" **登录主机是指定允许哪个主机登录,一般为了安全,就设为本地localhost **权限包括增删改查  select insert delete update 例:grant all privileges on b

Node 连接Mysql并进行增删改查

NPM: NPM的全称是Node Package Manager,类似于ruby的gem,Python的PyPL.setuptools,PHP的pear,是Nodejs中的包管理器.Nodejs自身提供了基本的模块.但是在这些基本模块上开发实际应用需要较多的工作.NPM上已经有近万个Nodejs库或框架,这些库从各个方面可以帮助Nodejs的开发者完成较为复杂的应用. 安装NPM(Unix下): curl http://npmjs.org/install.sh | sh 利用NPM安装Node模