mysql关于外键的引用_MySQL学习——关于外键foreign key的三种用法

本文详细介绍了数据库设计中唯一索引和外键的概念及应用。通过示例展示了如何使用唯一索引解决一对一、一对多和多对多关系的问题,包括用户表与博客表、用户表与部门表以及用户表与相亲表的关系设计。强调了在特定场景下,如何利用唯一索引来限制数据的冗余和确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节主要讲述外键的变种:

create database db1;

//先创建表

create table t1(

uid int auto_increment primary key,

name char(16),

department_id int)

engine=innodb default charset=utf8;

一、关于MySQL的唯一索引:

1、首先讲一讲MySQL唯一索引;所谓唯一索引,有2个内容:1,唯一:表示约束功能;2,索引:表示加速查找。

情况一:

create table t1(

uid int auto_increment primary key,

num int,

unique uql(num)//约束了num的的唯一性;

)engine=innodb default charset=utf8;

情况二:

create table t1(

uid int auto_increment primary key,

num int,

xxx int,

unique uql(num,xxx)

)engine=innodb default charset=utf8;

//这里的 unique uql(num,xxx)是联合唯一,什么是联合唯一,就是保证一组(num,xxx)与本表中的其他组(num,xxx)不一样;

2、关于外键的变种:

a  假设我有2个表:(以博客园举例)用户表与博客表

用户:id name

1 Alex

2 root

3 egon

4 laoyao

博客(并不是所有的用户都有博客,有点人没有申请就没有)

bid  blog_adress  uid  (fk()+唯一)

1    /yunchengqi/   4

2       /alex3714/     1

3    /xxxxxxxx/     1  //假设Alex有2个博客;

//但是博客园是不允许一个用户有多个博客的,一人一个; 这里的uid作为fk.对博客表加上一个外键约束

那么当我将只用外键关联到用户表上时,是不能解决1个用户有多个博客这个问题的;

所以这里要在博客表上的uid列用唯一索引,这样就约束了每一个地址对应1个用户;

------》》》》这样的情况就是一对一

b  用户表与部门表

用户:

id name   department_id   (fk())

1 Alex          1

2 root          1

3 egon          2

4 laoyao        3

部门:

1  服务

2  保安

3  公关

------》》》》这样的情况就是一对多

c 用户表与相亲表(多对多),拿百合网来举例子:

用户表

相亲表

//双向的一对多就是多对多。

用户表

create table userinfo(

uid int auto_increment primary key,

name char(16)),

email verchar(16)

engine=innodb default charset=utf8;

主机表

create table hostinfo(

hid int auto_increment primary key,

name char(16))

engine=innodb default charset=utf8;

然后创建一个用户主机表,将二者关联起来

create table user2host(

id int auto_increment primary key,

user_uid int,

host_hid int,

unique uq_user_host(user_uid,host_hid),

constraint fk_user_uid foreign key (user_uid) references userinfo(uid),

constraint fk_host_hid foreign key (host_hid) references hostinfo(hid))

engine=innodb default charset=utf8;

//这是双向的fk().

MySQL 约束可以用来保证表与表之间的关系完整性。当我们在一个表中定义了一个,它会引用另一个表中的列,这个被引用的列必须是另一个表的主或者是一个唯一。在 MySQL 中,约束可以跨越多个列。 下面是一个例子,演示如何在 MySQL 中定义一个约束,跨越两个列: ``` CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id, order_date) REFERENCES customers(id, date) ); ``` 在这个例子中,orders 表中的 customer_id 和 order_date 列都被用来定义约束,它们分别引用了 customers 表中的 id 和 date 列。这个约束确保了 orders 表中的每一行都有对应的 customers 表中的行,而且这个关联是基于 customer_id 和 order_date 两列的值。 在定义约束时,我们还可以指定 ON DELETE 和 ON UPDATE 规则,用来控制当关联表中的某一行被删除或更新时,对应的行应该怎么处理。常用的规则包括: - CASCADE:当关联表中的某一行被删除或更新时,对应的行也会被删除或更新。 - RESTRICT:当关联表中的某一行被删除或更新时,如果该行有对应的行,则不允许删除或更新。 - SET NULL:当关联表中的某一行被删除或更新时,对应的行的列会被设置为 NULL。 我们可以在定义约束时使用这些规则,例如: ``` CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id, order_date) REFERENCES customers(id, date) ON DELETE CASCADE ON UPDATE RESTRICT ); ``` 在这个例子中,我们指定了 ON DELETE CASCADE 和 ON UPDATE RESTRICT 规则,表示当 customers 表中的某一行被删除时,对应的 orders 表中的行也会被删除;当 customers 表中的某一行被更新时,只有当 orders 表中的行没有被引用时,才允许更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值