当前位置: 首页>数据库>正文

mysql 主键作为外键 mysql主键和外键的建立

MySql数据库主键外键与数据库设计

首先要指出的:
列、字段、属性是一个概念
行、记录、元组是一个概念

MySQL数据库CONSTRAINT约束:非空约束,唯一约束,主键约束,外键约束
show create table table_name\G;可以查看已建表的相关信息,包括主外键,外键名,存储引擎,编码方式等等

主键约束

主键:表中经常有一个列或者多列的组合,其值能唯一的标识表中的每一行,这样的一列或多列称为表的主键,通过它可以强制表的实体完整性,当创建或更改标识可以通过定义primary key约束来创建主键,一个表只能有一个primary key约束,而且primary key约束的列不能接受空值,由于primary key约束确保该列数据的唯一性,所以经常用来定义标识列。主键自带索引,并且一个表只能有一个主键约束
    实体完整性这项规则要求每个数据表都必须有主键,而作为主键的所有字段,其属性必须是独一及非空值。

主键的作用
用作标识列,区分其他字段
强制表的实体完整性
用于其他表的外键关联
用于记录的修改与删除
加速查询

  • 创建主键约束
  1. 建表时创建主键
    create table Student(id int primary key,name varchar(32) default null)
  2. 建表后添加主键
    create table Student(id int,name varchar(32));
    alter table Student add primary key(id);
  3. 建表后新加字段并设为主键
    create table Mother(id int,name varchar(32));
    alter tabler Mother add age int primary key;

删除主键约束
alter table Student drop primary key;

联合主键:用两个或两个以上的字段组成的主键,用这个主键包含的字段作为主键约束,这个组合在数据表中是唯一,且加了主键索引。

创建表时创建联合主键:
 create table STUDENT(id int auto_increment,courser int,name varchar(10),primary key(id,courser));已有的表添加联合主键:
 create table Person(id int,province varchar(8),city varchar(8),country varchar(8));
 alter table Person add constraint main_key primary key(id,province);

Person是表名,main_key 是联合主键名。在建好的表中我们添加了如下数据:

mysql 主键作为外键 mysql主键和外键的建立,mysql 主键作为外键 mysql主键和外键的建立_字段,第1张

由于id、province是联合主键,所以我们想要创立

mysql 主键作为外键 mysql主键和外键的建立,mysql 主键作为外键 mysql主键和外键的建立_字段_02,第2张

时,会出现如下报错

mysql 主键作为外键 mysql主键和外键的建立,mysql 主键作为外键 mysql主键和外键的建立_外键_03,第3张

但是我们可以让一个联合主键的一个字段名一样,另一个字段名不一样来创建,即联合主键的字段名不完全一致:

mysql 主键作为外键 mysql主键和外键的建立,mysql 主键作为外键 mysql主键和外键的建立_外键_04,第4张

删除联合主键的主键约束,由于主键约束在表单中的唯一性,我们可以直接删除:
alter table Person drop primary key;

外键约束

为了满足关系型数据库的第三范式,降低数据冗余,在表与表之间需要满足响应的关系,可以为表和表之间设置外键。
外键约束:用于两个表的数据的数据连接,一个表可以有多个外键,MySQL中的innodb存储引擎支持外键;
外键对应的是参照完整性,一个表的外键可以是空值,若不为空值,则每一个外键的值必须等于另一个表中的主键的某个值。定义一个外键后,不允许删除另一个表中具有关联关系的行;外键的主要作用是保持数据的一致性、完整性。一个主键表某一字段的和跟他有关联的外键表的某一字段有直接的关联。
对于有外键关联的两个表来说:
主表(父表):主键所在的表
从表(字表):外键所在的表

mysql设置外键约束字段选取
父表必须是已经存在或者正在创建的表
父表主键不能包含空值,但外键可以有
外键列的数目必须和父表的主键中列的数目相同
从表外键列和主表主键列对应的列的数据类型相同

创建表时设置外键约束

create table friend(id int ,name varchar(20),foreign key(id) references child(id));
 父表child,子表friend

在已有的表中设置外键约束
alter table subject add foreign key(id) references child(id);
注意:子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则创建子表时会出现错误。

删除外键约束
有外键约束的列必须先删除外键,然后才能删除该列:
alter table subject drop foreign key subject_ibfk_1;
subject_ibfk_1是外键的名字,我们可以自己设,也可以系统生成,这样的话我们要查看建表信息才能知道外键名字是什么。

查看表中的外键

show create table table_name
 select * from information_schema.key_column_usage;

数据库设计

数据库范式与设计:一对一,一对多,多对多
关系型数据库的特点:基本组成但对为二维表,各二维表之间存在一定的关系,数据库范式级别越高,数据冗余越低
第一范式:字段不可再分,只要是个二维表都符合第一范式
第二范式:每个表都有一个能区分每条记录的主键(非空 唯一 索引)
第三范式:表中所用数据元素不但能惟一的被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系,只有通过外键来互相联系

表与表之间的三种关系:

一对一:如学生分数表与学生信息表,两表有一样的主键ID

一对多:如教学楼和教室,班级表和学生表的班级ID,多个从表通过外键连接主表主键完成一对多的关系

多对多:如学生表和课程表,演员和电影;以演员和电影为例,分别建立演员表和课程表,演员表电影表不重复,然后建立一个关系表,将两个表连接起来,变成连个一对多的关系:

mysql 主键作为外键 mysql主键和外键的建立,mysql 主键作为外键 mysql主键和外键的建立_mysql 主键作为外键_05,第5张

建立演员表
 create table actors(id int auto_increment primary key,name varchar(10));
 建立电影表
 create table films(id int auto_increment primary key,name varchar(20));
 建立中间表,并通过外键连接其他相关表
 create table link(id int auto_increment primary key,id_a int,id_f int);
 alter table link add foreign key(id_a) references films(id);
 alter table link add foreign key(id_f) references actors(id);这里我们想查询成龙演过的电影:
 select name,f_name from(select * from actors inner join(select id_a,id_f,name as f_name from link inner join films on films.id=link.id_f) as a on a.id_a=id having id=1) as b;



https://www.xamrdz.com/database/6rp1939640.html

相关文章: