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

article/2025/10/6 0:45:42

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 是联合主键名。在建好的表中我们添加了如下数据:
在这里插入图片描述

由于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;


http://chatgpt.dhexx.cn/article/mNHWdGwA.shtml

相关文章

mysql外键

虽然阿里不推荐使用MySQL外键,但是我们的项目如果对数据的一致性不太敏感,外键还是非常好的!减少数据库的数据冗余。如果对数据一致性有着非常高的要求,如:使用事务,那么强烈建议该表及关联表不要使用外键&…

数据库外键理论及MySQL外键实现规定

文章目录 1. 关系数据库外键概念理论(大学时学习的概念)1.1 实体完整性1.2 ✅ 参照完整性1.3 用户定义完整性1.4 ✅ 参照完整性的SQL实现1.5 ✅ MySQL数据库操作示例1.6 ✅ neo4j中的关系和mysql的外键 2 MySQL中实现的规定2.1 基本概念2.2 ✅ 命名规则2…

数据库(外键及其约束理解)

一:首先是外键的定义 如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的主键&am…

数据库的外键:主表与从表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言Mysql的外键是什么,有何用?代码演示总结 前言 提示:这里可以添加本文要记录的大概内容: 最近在学习数据库&…

【数据库】外键的作用

前言 说到外键,一般就会牵扯出约束。不谈约束,起始外键就是一个普通的字段(Column),起到一个关联的作用。 先把约束放一边,看看外键有哪些作用。 建立表中记录的一对一的关系 学生表: 手机表…

数据库之外键

外键约束(FOREIGN KEY)用来在两个表的数据之间建立连接,它可以是一列或者多列。一个表可以有一个或多个外键。 (1)外键定义:一张表中某一列的值使用的是另外一张表的主键值。这个列就被称为外键列。 &#…

数据库mysql表怎么设置外键_如何设置数据库中的外键

展开全部 创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只e69da5e887aa62616964757a686964616f31333365653739有主键没有外键时不行的。 建外键的前提是此外键必须是另外一个表的主键。建外键的步骤: 第一步、打开要建外键表的设计器,右击…

数据库表外键设置

http://blog.csdn.net/pplsunny/article/details/7747340 我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标…

数据库——外键的作用

我们用一个比较实际的例子来描述问题,并讲解外键作用: 当我们在网上购物的时候,我们有我们的帐号,还有我们所在不同地方的地址信息如公司,学校,家里,或者给亲戚朋友送个礼物,收货人…

mysql数据库添加外键的四种方式

文章目录 一、添加外键的四种方式二、文档下载 一、添加外键的四种方式 1、 建表时直接使用FOREIGN KEY,这种方式外键名称自动生成。如下图。 FOREIGN KEY (user_id) REFERENCES t_user(id)2、 建表时使用CONSTRAINT指定外键名称。如下图。 CONSTRAINT fk_studen…

彻底理解数据库外键

外键的定义 如果 公共关键字在一个关系中是 主关键字,那么这个 公共关键字被称为另一个关系的 外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外…

什么是数据库外键?

外键 Teacher_id就是student的外键 Teacher是主表,student是子表(从表) 外键就是一个表中的一个字段引用了另一个表中的主键,引用的表叫做子表,被引用的表叫做主表,外键是一种约束,描述的是表之…

数据库常用命令之外键(foreign key)多对多(总结,基础)

我是小白,刚接触MySQL不久,现阶段正在学习,为此在这里留下自己的学习笔记。如果有错误的地方还请大家见谅,评论或者私发我错误的地方哦,谢谢大家,嘿嘿~ 外键(foreign key) 引言&…

MySQL中的外键(foreign key)

阅读目录 前言一、外键作用及其限制条件1 外键的定义2 外键的作用3 外键创建限制 二、外键创建方法1 创建外键的语法2 举例(1)创建两张表(2)创建外键(3)查看表结构 三、验证外键作用1 先向主表中添加数据2 …

显示gsensor即时数据的apk 用gsensor来判断手机的静和动

即时显示gsensor的数据,可以在调试重力感应器驱动和测试手机性能时起到很好的作用。类似的,SensorEventListener还可以用在其他感应器的场合,比如光感应、地磁感应。这里用两种方式来完成读取并显示gsensor数据的功能,一种是activ…

老化测试Gsensor失败分析

在log中搜Gsensor可以看到如下: 在Y:\1\18045c1老化\bug127302c1_slog\last_log\2015-01-01-06-19-23\android\0-events-06-19-24.log中搜到如下: 行号 500 - 01-01 06:36:08.996 664 2050 I am_create_activity: [0,509924699,15,com.wingtech.runin…

MTK 9.0平台调试gsensor

MTK 9.0平台调试gsensor ----型号为:stk8baxx 1 查看原理图可以知道stk8baxx重力传感器 使用i2c1通道进行通讯,由于该重力传感器是不使用中断模式的进行触发的,所以不需要配置中断引脚。由此可以配置stk8baxx重力传感器的dts dts文件配置如…

APK无法识别gsensor问题剖析

APK无法识别gsensor问题的原因有很多,这里只是提供一条思路,解决现有项目遇到的问题。 1、确保驱动层可以工作。 2、打印LOGCAT数据,分析sensorservice流程 1、移植流程: 步骤:移植gsensor驱动,mc3413&am…