MySql数据库主键外键与数据库设计
MySql数据库主键外键与数据库设计
首先要指出的:
列、字段、属性是一个概念
行、记录、元组是一个概念
MySQL数据库CONSTRAINT约束:非空约束,唯一约束,主键约束,外键约束
show create table table_name\G;可以查看已建表的相关信息,包括主外键,外键名,存储引擎,编码方式等等
主键约束
主键:表中经常有一个列或者多列的组合,其值能唯一的标识表中的每一行,这样的一列或多列称为表的主键,通过它可以强制表的实体完整性,当创建或更改标识可以通过定义primary key约束来创建主键,一个表只能有一个primary key约束,而且primary key约束的列不能接受空值,由于primary key约束确保该列数据的唯一性,所以经常用来定义标识列。主键自带索引,并且一个表只能有一个主键约束
实体完整性这项规则要求每个数据表都必须有主键,而作为主键的所有字段,其属性必须是独一及非空值。
主键的作用:
用作标识列,区分其他字段
强制表的实体完整性
用于其他表的外键关联
用于记录的修改与删除
加速查询
- 创建主键约束
- 建表时创建主键
create table Student(id int primary key,name varchar(32) default null) - 建表后添加主键
create table Student(id int,name varchar(32));
alter table Student add primary key(id); - 建表后新加字段并设为主键:
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 是联合主键名。在建好的表中我们添加了如下数据:
由于id、province是联合主键,所以我们想要创立
时,会出现如下报错
但是我们可以让一个联合主键的一个字段名一样,另一个字段名不一样来创建,即联合主键的字段名不完全一致:
删除联合主键的主键约束,由于主键约束在表单中的唯一性,我们可以直接删除:
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,多个从表通过外键连接主表主键完成一对多的关系
多对多:如学生表和课程表,演员和电影;以演员和电影为例,分别建立演员表和课程表,演员表电影表不重复,然后建立一个关系表,将两个表连接起来,变成连个一对多的关系:
建立演员表
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;
MySql数据库主键外键与数据库设计相关推荐
- C# 数据库dataGridView刷新数据和主外键判断
本文主要讲诉在使用VS2012+SQL Server数据库做系统中,通常会遇到几个问题.使用dataGridView控件在修改.删除.插入数据后,怎样刷新数据显示操作后的结果.同时在对数据操作时通常会 ...
- mysql添加数据不阻塞_主键表插入数据不提交,外键表插入数据被阻塞
有客户和我说:他在含主外键的表中实验发现,在主表数据未提交,然后在外键表插入该数据数据时,出现外键表hang住现象.我开始以为是不同的会话,根据oracle数据库的一致性原则,应该新会话在外键表中不能 ...
- mysql是否需要设置外键_数据库到底需不需要设置外键?
在大型系统中(性能要求不高,安全要求高),最好使用外键(外键可以增强数据库数据的完整性和一致性) 在大型系统中(性能要求高,安全自己控制),不用外键(有外键约束的话,插入字段会进行检查,影响效率) 小 ...
- mysql中什么叫外键_数据库中外键是什么?
什么是外键? 外键 ( foreign key ) 是用于建立和加强两个表数据之间的链接的一列或多列.通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接.这个列就成为第二个表的外 ...
- 更改mysql数据库主键自增时报错ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1
当我用SQLyog尝试修改已有记录的mysql数据表的主键为自动增长时,报出以下错误 ALTER TABLE causes auto_increment resequencing, resulting ...
- MySQL为表添加外键约束
为表添加外键约束的语法 Alter table 表名 add constraint FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键字段名): 为表student ...
- MySQL表的非外键约束
MySQL表的非外键约束 /* 建立一张用来存储学生信息的表 字段包含学号.姓名.性别,年龄.入学日期.班级,email等信息 学号是主键 = 不能为空 +? 唯一 姓名不能为空 性别默认值是 ...
- mysql 主键外键sql_SQL外键VS主键说明了MySQL语法示例
mysql 主键外键sql A Foreign Key is a key used to link two tables. The table with the Foreign Key Constra ...
- [数据库03]-约束(唯一性-主键-外键/存储引擎/事务/索引/视图/DBA命令/数据库设计三范式
[数据库03]-约束(唯一性-主键-外键)/存储引擎/事务/索引/视图/DBA命令/数据库设计三范式 一.约束 1.1 唯一性约束(unique) 1.2 主键约束 1.3 外键约束 二.存储引擎 2 ...
最新文章
- springboot mybatis 事务_SpringBoot 下 Mybatis 的缓存
- axis2 java.net.url_axis,axis2调用.net的webservice
- js实现算法--割字符串
- 变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在
- AspxTreeList获取选中项的值
- Android MVP Presenter 中引发的空指针异常
- 七月算法机器学习 6 特征工程 小案例
- 我的世界服务器权限组权限修改器,我的世界op权限组指令是什么 op权限组指令汇总...
- CMMB 全国各地市频率规划表
- Linux UDP协议栈中的片段分析 - udp_recvmsg
- 算法-“许三多”方法
- python文件拷贝并校验_Python札记 -- 文件校验
- 个人微信号API接口搜集
- 联想电脑安装Ubuntu后无法进入bios
- BERT模型—7.BERT模型在句子分类任务上的微调(对抗训练)
- 一个新开端,存储服务器再添骨灰级玩家
- 剑指 Offer II 080. 含有 k 个元素的组合
- 移动硬盘无法弹出,显示被进程占用(system占用)
- 2016蓝桥杯报纸页数(C++C组)
- 机器学习应用在哪些方向?机器学习应用实例
热门文章
- 零售业如何抓住机遇?“主动出击”才是首选
- SuperMap iDesktop不同椭球体投影坐标系的转换
- 无线蓝牙骨传导耳机哪个品牌好?最值得入手的几个款式
- gtasa手机版android7.1,圣安地列斯奥特曼mod
- git的环境变量配置
- 论文阅读:Deep Learning with Differential Privacy
- 寻路算法c语言,C++算法之寻路算法
- element ui el-table 如何实现带斜线的双表头
- java list移除符合条件的元素_java List删除指定元素的三种方法
- DictionaryEntry来循环访问Hashtable对象的实例