MySQL学习笔记(15)-外键

外键

外键:foreign key,外面的键(键不在自己表中):如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该子段称之为外键。

外键可以在创建表的时候或者创建表之后增加(但是要考虑数据的问题)。

增加外键

创建表的时候增加外键:在所有的表字段之后,使用foreign key(外键字段)references外部表(主键字段)

一张表可以有多个外键

desc my_class;
select * from my_class;
-- 创建外键
create table my_foreign1(
id int primary key auto_increment,
name varchar(20) not null comment '学生姓名',
c_id int comment '班级id', -- 普通字段
-- 增加外键
foreign key(c_id) references my_class(id)
)charset utf8;
desc my_foreign1;
show create table my_foreign1;



在新增表之后增加外键:修改表结构

alter table 表名 add[constraint 外键名字] foreign key (外键字段) references 父表(主键字段);

-- 创建表
create table my_foreign2(
id int primary key auto_increment,
name varchar(20) not null comment '学生姓名',
c_id int comment '班级id'  -- 普通字段
)charset utf8;
desc my_foreign2;
desc my_foreign2;
-- 增加外键
alter table my_foreign2 add
-- 指定外键名
constraint student_class_1
-- 指定外键字段
foreign key(c_id)
-- 引用父表主键
references my_class(id);
desc my_foreign2;
show create table my_foreign2;


修改外键&删除外键

外键不可修改:只能先删除后新增。

alter table 表名 drop foreign key 外键名; --一张表中可以有多个外键但是名字不能相同

desc my_foreign1;
alter table my_foreign1 drop foreign key my_foreign1_ibfk_1;
desc my_foreign1;
show create table  my_foreign1; 

select * from my_class;
-- 插入数据:外键字段在父表中不存在
insert into my_foreign2 values(null,'张三',4) -- 没有4班级

insert into my_foreign2 values(2,'项羽',1);
insert into my_foreign2 values(3,'刘邦',2);
insert into my_foreign2 values(4,'韩信',2);
select * from my_class;
-- 更行父表记录
update my_class set id = 4 where id =1 ;失败:id=1记录已经被学生引用
update my_class set id = 4 where id=3; -- 可以:没有引用

外键条件

1.外键要存在:首先必须保证表的存储引擎是innodb(默认的存储引擎):如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果。

2.外键字段的字段类型(列类型)必须与父表的主键类型完全一致。

3.一张表中的外键名字不能重复。

4.增加外键的字段(数据已经存在),必须保证数据与父表主键要求对应。

select * from my_foreign1;
select * from my_class;
-- 增加外键
alter table my_foreign1 add foreign key(c_id) references my_class(id);

外键约束

所谓外键约束:就是指外键的作用。

之前所讲的外键作用:是默认的作用;其实可以通过对外键的需求,进行定制操作。

外键约束有三种约束模式:都是针对父表的约束

    District:严格模式(默认的),父表不能删除或者更新一个已经被子表数据引用的记录

    Cascade:级联模式:父表的操作,对应子表关联的数据也跟着被删除

    Set null:置空模式:父表的操作之后,子表对应的数据(外键字段)被置空

通常的一个合理的做法(约束模式):删除的时候子表置空,更新的时候子表级联操作指定模式的语法

Foreign key(外键字段) references 父表(主键字段)on delete set null on update cascade;

-- 创建外键:指定模式:删除置空,更新级联
create table my_foreign3(
id int primary key auto_increment,
name varchar(20) not null,
c_id int,
-- 增加外键
foreign key(c_id)
-- 引用表
references my_class(id)
-- 指定删除模式
on delete set null
-- 指定更新模式
on update cascade)charset utf8;
-- 插入数据
insert into my_foreign3 values(null,'刘备',1),
(null,'曹操',1),
(null,'孙权',1),
(null,'诸葛亮',2),
(null,'周瑜',2);


更新操作:级联更新

select * from my_foreign3;
select * from my_class;
-- 更新父表主键
update my_class set id = 7 where id = 6;
select * from my_class;
select * from my_foreign3;

删除置空

select * from my_foreign3;
-- 删除父表主键
delete from my_class where id = 7;
select * from my_class;
select * from my_foreign3;

外键虽然很强大,能够进行各种约束:但是对应PHP来讲,外键的约束降低了PHP对数据的可控性:通常在实际开发中,很少使用外键来处理。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL中的REFERENCES用于定义约束,它指定了一个表中的列与另一个表中的列之间的关系。通过使用REFERENCES,可以确保在插入或更新数据时,只能使用已存在的值作为值,从而保证数据的完整性和一致性。同时,REFERENCES还可以指定当主表中的数据被删除或更新时,从表中的数据应该如何处理,例如CASCADE、SET NULL等。 ### 回答2: MySQL中的references是一个非常重要的关词,它主要用于关系型数据库中的指定,确保数据表之间的约束关系。当一个数据表关联到另一张数据表时,我们可以使用references来定义它们之间的约束条件。 在MySQL中,通常使用CREATE TABLE语句来定义关系型数据库表结构。在创建表时,我们可以使用references关词来定义的约束条件。具体做法是在表的定义过程中,在需要作为的字段属性中添加关词REFERENCES,再跟上被关联的表名称及其属性名,如下所示: CREATE TABLE orders ( order_id INT(11) NOT NULL AUTO_INCREMENT, customer_id INT(11) NOT NULL, order_date DATE NOT NULL, PRIMARY KEY (order_id), FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); 以上代码创建了一个orders表,其中customer_id字段通过FOREIGN KEY关词被定义为。该指向customers表的customer_id字段。这意味着在orders表中的customer_id字段不能够引用customers表中不存在的customer_id记录。因此,使用REFERENCES关词可以确保关系型数据库中的数据完整性和稳定性。 除了创建表时使用references关MySQL还提供了一些其他的references使用场景。例如,我们可以在ALTER TABLE或CREATE INDEX语句中使用references关词,以进一步定义表之间的关联关系。 总之,references关词在MySQL中非常重要,它用于定义关系型数据库表之间的约束关系,确保数据表之间的数据完整性和稳定性。掌握该关词的使用方法和场景非常重要,有助于我们设计和维护高效的关系型数据库系统。 ### 回答3: 在MySQL中,REFERENCES可以在创建表时定义是指一个表中的列参照了另一个表中的主列,在实际使用中可以保证数据的一致性和完整性。 以下是使用REFERENCES定义的语法: ``` CREATE TABLE 子表名 ( 列1 数据类型 PRIMARY KEY, 列2 数据类型, 列3 数据类型, ... FOREIGN KEY (列2) REFERENCES 父表名(父表列) ); ``` 例如,我们创建一个订单表Order和一个用户表User,订单表中有一个列userId表示用户ID,那么我们可以在创建Order表时使用REFERENCES定义: ``` CREATE TABLE User ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE Order ( id INT PRIMARY KEY, userId INT, ... FOREIGN KEY (userId) REFERENCES User(id) ); ``` 这里Order表中的userId是一个,它参照了User表中的id列。这样,当我们在Order表中插入数据时,如果userId列的值不存在于User表的id列中,MySQL会抛出错误提示,从而保证数据的一致性和完整性。 需要注意的是,使用REFERENCES定义需要遵循一些限制条件: 1. 父表的主必须是唯一的,并且不能为空值。 2. 子表中定义的列必须和父表的主列具有相同的数据类型和精度。 3. 在父表中删除或更新某一行时,要么将所有子表中相关的行一并删除或更新,要么禁止进行删除或更新操作。 4. 的定义必须满足MySQL的存储引擎的支持。例如,MyISAM不支持功能。 综上所述,使用REFERENCES定义可以保证数据库中数据的完整性和一致性,但是要注意使用时的限制条件和存储引擎的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值