主键可以是真实实体的属性,但是常用的好的解决方案是,利用一个与实体信息不相关的属性,作为唯一标示(加个id字段)
主键与业务逻辑不发生关系,只用来标示记录
可以在定义完字段后,再定义多列主键(组合主键) 例:primary key(id,name,age);(不是说3个字段都是主键,
因为一个表只能有一个主键,可以是3个字段组合成的主键)
设计:
两个实体表内,存在相同的主键字段
如果记录的主键值等于另一个关系表内记录的主键
则两天记录对应 1:1对应 数据库设计的时候(常用的信息和不常用的信息分开存放)称为:垂直分割 劣势:数据冗余,结构冗余
1:n ,1一对多
一个实体,对应多个其他实体,例如一个班级对应多个学生
设计:在多的那端,增加一个字段,用与指向该实体所属的列的实体标志
2、N:N 多对多
设计: 典型的,利用一个中间表 ,表示实体之间的对应关系
外键 foreign key 概念:如果一个实体的(student)的某个字段(class_id),
指向(引用)另个实体的主键,就称student实体的外键
被指向的实体,称之为实体(主表),也叫父实体(父表) class
负责指向的实体,称之为从实体(从表),也叫子实体(子表) student
作用:用于约束处于关系内的实体,增加子表记录时,是否有与之对应的父表记录
在删除或者更新主表记录时,从表应该如何处理相关的记录
定义一个外键:在从表上,增加一个字段,指向主表的主键,
在最后增加 foreign key(外键字段) regerences itcast_class(class_id) on delete set null
设置字符集 character set utf8;
设置级联操作
在主表数据发生改变时,与之关联的从表数据应该如何处理
主表更新:
主表删除
使用关键字
On update
On delete
允许的级联动作
Cascade关联操作,如果主表被跟新或删除,那么从表也会执行相应的操作
Set null 设置为null,表示从表不指向任何主表记录
Restrict 拒绝主表的相关操作
alter table xxx add foreign key (yyy_id) references yyy(yyy_id)
xxx:表示从表 yyy表示主表 yyy_id表示外键
醉了,看到现在说这些一般在项目中不用 --!!!
只有InnoDB支持外键