PHP学习练手(六)

  • 主键:
    • 始终有一个值(不能为NULL)
    • 具有一个保持不变的值(不人为修改的前提下)
    • 表中的每一条记录都有唯一的值
  • 外键:外键是表A中的主键在表B中的代表。

  • 举例:
    表一

分析:最有可能的主键即为username和actual email,因为它们在注册论坛时是唯一的,但是“表中的每一条记录都有唯一的值”我的理解是,对任意一列,如message subject,上一条和下一条的主键是不同的,若username 或actual email为主键,有可能2条message subject均是同一个用户所发的,故矛盾不可取。
解决:添加一个字段message ID。这样对于message subject 的上一条或下一条来说ID号是不同的。其他的也类似。
表二


三范式

  • 第一范式(1NF):

    1、每一列必须仅包含一个值(有时候这被描述为原子性或不可分割性)
    2、所有表都不具有相关数据的重复列
    3、技巧:横向分析表的规则:检查单独一行的所有列,确保唯一性并避免重复出现类似的数据

    举例:
    1、表一和表二中“actual name”不符合条件1:actual name = first name + last name。修改如下:
    表三

    2、下表中,在数据库创建该表时,”actor1”、”actor2”、
    “actor3”将成为新表的第4、5、6列,此时不满足条件2(”不具有重复列”)
    表四

    解决:将一位演员与一个电影挂钩,如下:
    表五

  • 第二范式(2NF)

    1、首先必须符合第一范式
    2、遍中所有非键列必须依赖主键
    3、技巧:纵向查表,某一列在多行中具有相同的非键值,则违反了第二范式

    举例:
    表四中”movie title”并没有指明所插入的电影名一定是不相同的,故表中该”movie title”列不同行上的元素值可能相同,尽管此时每行的主键”movie ID”不同,(我的理解:所谓非键列依赖主键是指当主键值不同时,其对应的非键值也要不同,否则非键值有可能相同,通俗地讲,”管你主键值怎样,我想相同就相同,不受你制约”)。
    解决:给出4个新表,如下:
    这里写图片描述

  • 第三范式(3NF)

    1、数据库符合第二范式,并且每个非键列是相互独立的,那它就符合第三范式
    2、技巧:若改变一列中的某个值需要改变另一列的某个值,那就违反了第三范式


索引

数据库用于提高SELECT 查询效率的特殊体质。索引可以被设置到1列或多列,可以设置为任何类型。MySQL可以保证为每个表创建16个索引,每个索引可以最多包含15列。


索引适合查询的列:
- 查询的WHER部分中频繁使用的列
- 在查询的ORDER BY中频繁使用的列
- 经常被用于JOIN连接点的列


不适合创建索引的列:
- 允许为空的列
- 字段值的范围很有线(例如仅仅是Y/N或1/0)

索引类型:

  • index——标准索引。
  • unique——每一行对于索引列值具有唯一值(个人理解:插入该列的所有值都必须完全不同)
  • fulltext——用于执行fulltext查找
  • primary key——主键,特殊的unique索引
  • 举例: INDEX_TYPE index_name(columns)

表类型

  1. MyISAM

    • 优点:适用于大部分程序,处理SELECT和INSERT都非常快。
    • 缺点:不能处理事务。由于缺少行级的锁定,MyISAM很容易损坏并且在发生崩溃时数据容易丢失。
  2. InnoDB:

    • 优点:可以使用事务,并且在处理UPDATE的时候表现良好。支持外键约束和行级锁定。
    • 缺点:比MyISAM慢,需要更多的服务器磁盘空间,不支持fulltext索引

引擎,字符集,校对规则等

实例练习:

  1. 设定数据库的字符集和校对规则:CHARACTER COLLATE
    这里写图片描述

  2. 设置表引擎为InnoDB:ENGINE=INNODB
    这里写图片描述

  3. 设置表引擎为MyISAM,添加index索引和外键
    这里写图片描述

  4. 继续建表,引擎为InnoDB,添加unique索引
    这里写图片描述
  5. 向forums表中插入值
    这里写图片描述
  6. 向users表中插入值
    这里写图片描述
  7. 结果显示
    这里写图片描述
    注:此时forum_id 未按照顺序显示,经实践,发现与设置了unique索引值有关。
    这里写图片描述

    这里写图片描述


外键约束

  • 创建外键约束的语法:FOREIGN KEY (iter_name) REFERENCES table_name (column)

  • 外键约束条件:由于只有InnoDB表类型的表支持外键约束,故相关的两个表必须是InnoDB类型

1、如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何insert或update操作。

2、如果父表试图update或delete任何子表中任何存在或匹配的外键值,最终动作取决于外键约束中的 on updateon delete 操作。InnoDB支持5种不同的动作:
— a)CASCADE:从父表中删除或更新对应的行时,同时自动的删除或更新子表中对应的行。
— b)SET NULL:删除父记录将导致将导致子表中相应的外键被设置为NULL,如果表的该列被定义为NOT NULL,删除父记录将引发一个错误
— c)NO ACTION:子表存在匹配项,则拒绝删除或更新父表
— d)RESTRICT:同NO ACTION
— e)SET DEFAULT :InnoDB暂不支持这种操作。
摘自 http://www.cnblogs.com/ribavnu/p/3696857.html

示例:
1-创建customers表:
这里写图片描述

2-创建accounts表:
附:一个customer可能有多个账户,因此,父表为customers,子表为accounts,从而建立外键约束。
这里写图片描述

3-创建transactions表:
附:账户之间可能有资金流通,流通表transactions中资金有2种状态:一是从哪个账户转出的;二是转入到哪个账户中去。所以有2个外键from_account_id 和to_account_id。
这里写图片描述

4-向customers和accounts表中插入数据并显示:
这里写图片描述

5-尝试将不存在的客户数据写入到accounts中,即对子表进行操作:
这里写图片描述
结果:在没有有效的客户ID的情况下,customers表中的外键约束会阻止创建账户,与条件1符合。

6-尝试在存在账户记录的情况下删除customers表中一条记录,即对父表进行操作:
这里写图片描述
结果:由于id=2的用户在子表中存在匹配项,针对父表进行操作时外键约束动作为NO ACTION,故符合条件2中的NO ACTION项,操作失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值