MySQL 外键

补充:

Comment  ’注释内容’;

 

Set names gbk;客服端与服务器之间。

 

外键:

 

1.概念:

一个实体的某个字段指向另一个实体的主键,那么这个字段就是一个外键

其中,被指向的实体,叫做主实体(主表),也叫父实体(父表)

负责指向的实体,叫做从实体(从表),也叫子实体(子表)

 

2.作用:

用于约束处于关系内的实体。

增加子表记录时,是否有与之对应的父表记录。

在删除或者更新主表记录时 ,从表该如何处理相关的记录。

 

3.语法:

Foreign key(外键字段)references 表名 (主键字段)

子表建立字段指向父表主键。

 

4.设置级联操作(关联动作):

在主表数据发生改变时,与之关联的从表数据应该如何处理:

主表更新:On update

主表删除:On delete

允许级联动作:

Cascade :执行同联操作,如果主表被更新或者删除,那么从表也会执行相应的操作。

Set null :设置为null,表示从表不指向任何主表记录。

Restrict :拒绝主表的相关操作。

 

修改外键,必须先删除,再重新创建。

Ater table 表名 drop foreign key 字段

删除外键需要通过指定完整的外键名称来达到目的:

可以通过在创建外键时,指定名称,

后者通过show create table 表名

来找到约束外键名称CONSTRAINT完整的外键名称’;

 

注意:此时删除的是约束条件,原本从表中的数据并不发生改变。

 

Ater table 表名 add foreign key 字段

 

注意:此时新建的也是约束条件,原本从表中的数据并不发生改变。

 

 

 

 

On delete set null;删除时,将从表的外键值设置为null

On delete cascade;删除时,从表的整条记录也将被删除;

On update ; 指的是,只有主表的主键发生变化,才会对从表产生反应;

On update restrict ;拒绝修改主表。

 

高级数据库管理员才使用,一般项目都不使用外键。


create table itcast_class(
class_id int primary key auto_increment,
class_name varchar(10) not null default '' comment '班级姓名'
)character set utf8;

create table itcast_student(
stu_id int primary key auto_increment,
stu_name varchar(10),
class_id int ,
foreign key (class_id) references itcast_class (class_id)
)character set utf8;

insert into itcast_student values (null,'Mike',1);
/*
Cannot add or update a child row: a foreign key constraint 
fails (`php_one`.`itcast_student`, CONSTRAINT `itcast_student_ibfk_1`
 FOREIGN KEY (`class_id`) REFERENCES `itcast_class` (`class_id`))
没有新建class_id 为1 的班级,因此没有对应找到相应的班级。
*/

insert into itcast_class values(null,'php0331');
insert into itcast_student values (null,'Mike',1);/*成功*/
select * from itcast_student;

/*对foreign的修改*/
show create table itcast_student;

alter table itcast_student drop foreign key itcast_student_ibfk_1; 
/*删除外键-完整的外键名称*/
show create table itcast_student\G;  /*约束字段消失*/

alter table itcast_student add foreign key (class_id) references itcast_class (class_id)
on delete set null;
select * from itcast_class;
select * from itcast_student;

delete from itcast_class where class_id=1;
select * from itcast_class;                 /*主表为empty*/
select * from itcast_student;               /*class_id 为null,前提是class_id可以为null*/

/*先维护数据*/

alter table itcast_student drop foreign key itcast_student_ibfk_1; 
show create table itcast_student\G;

alter table itcast_student add foreign key (class_id) references itcast_class (class_id)
on delete cascade;
delete from itcast_class where class_id=1;
select * from itcast_class;               /*主表为empty*/
select * from itcast_student;             /*从表为empty*/


/*先维护数据*/

alter table itcast_student drop foreign key itcast_student_ibfk_1; 
show create table itcast_student\G;


alter table itcast_student add foreign key (class_id) references itcast_class (class_id)
on delete cascade
on update restrict;

update itcast_class set class_id=1 where class_name='php0331'; /*有限制restrict,无法更新*/





### MySQL的使用方法与问题排查 在MySQL中,(Foreign Key)用于维护表之间的参照完整性。约束要求子表中的值必须出现在父表的主或唯一值中。如果违反了这种约束,数据库操作将被阻止。 当创建时,必须确保父表和子表都满足以下条件[^1]: - 父表必须包含一个索引(通常是主或唯一索引),该索引对应于子表中的列。 - 子表中的列也必须有索引支持,否则会抛出错误“Failed to add the foreign key constaint. Missing index for constraint”。 以下是创建的基本语法: ```sql ALTER TABLE child_table ADD CONSTRAINT fk_name FOREIGN KEY (child_column) REFERENCES parent_table(parent_column) ON DELETE CASCADE ON UPDATE CASCADE; ``` 此,如果启用了`sql_require_primary_key`系统变量,则尝试删除主会导致错误[^2]。这意味着,在设计数据库结构时,需要特别注意主的存在性以及其对其他依赖关系的影响。 对于问题的排查,可以按照以下方法进行: 1. 检查父表是否为主或唯一添加了索引。 2. 确保子表中列已建立索引。 3. 验证数据类型和字符集的一致性。父表和子表的相关列必须具有相同的数据类型和字符集设置。 如果遇到具体错误,例如“Missing index for constraint”,可以通过以下SQL语句检查现有索引: ```sql SHOW INDEX FROM child_table; ``` 这有助于确认列是否确实存在索引。 #### 示例:修复约束问题 假设存在如下两张表: - `parent_table(id INT PRIMARY KEY)` - `child_table(child_id INT, parent_id INT)` 若要为`child_table`添加约束,但出现错误,可以先为`parent_id`添加索引: ```sql ALTER TABLE child_table ADD INDEX (parent_id); ALTER TABLE child_table ADD CONSTRAINT fk_parent FOREIGN KEY (parent_id) REFERENCES parent_table(id); ``` ### 关于phpMyAdmin测试环境 在实际部署过程中,如果因版本过低无法完成某些功能测试,可以考虑使用phpMyAdmin作为替代工具[^3]。通过图形化界面,用户能够更直观地管理数据库对象,包括创建、修改和删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值