php - mysql如何实现外键
PHP中文网
PHP中文网 2017-04-11 10:13:54
[PHP讨论组]

我有个分类表


还有个商品表


我想实现删除分类就删除这个分类下的所有商品 这个如何在数据库实现呢

PHP中文网
PHP中文网

认证0级讲师

全部回复(7)
怪我咯

外键是限制必须删除所有商品时才能删除这个分类吧;
删除分类就删除所有的商品,是不是需要用个触发器。

没太研究过外键,我们的库不是程序自动生成的基本没有外键,数据维护起来太麻烦。

高洛峰

一般我们在做时就是当删除这个分类时查找商品里面有这个分类id的,直接删除就好了

大家讲道理

就大学那会教sql server用过外键,现在没用过

怪我咯

使用触发器,个人认为没有必要。直接在程序端实现就可以了

大家讲道理

MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户

进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。
详细的可以看mysql外键实战,希望对你有帮助(PS:楼主外健的健还是错别字,强迫症看着难受!!!)

怪我咯

这个的实现其实和外键没有关系,应该在数据库里面设置个触发器

DELIMITER $
create trigger 触发器名称
before delete on 分类表 for each row
begin
    delete from 商品表 where category_id = old.category_id;
end;$

除此之外,商品表应该是要有一个外键连接到分类表,如果是 MySQL 的话,可以执行下面的语句:

ALTER TABLE `商品表` ADD CONSTRAINT `外键名称` 
FOREIGN KEY (`category_id`) REFERENCES `分类表`(`category_id`) 
ON DELETE RESTRICT ON UPDATE RESTRICT;

PS. MySQL 默认引擎 MyISAM 是不支持外键的,要使用外键需将引擎设置为 InnoDB :ALTER TABLE `数据表名称` ENGINE = InnoDB;

PSS. 楼上说没有必要用触发器,直接在程序端实现就可以的:如果在程序执行中因为某种因素被中断,那么就会导致数据不完整的问题出现,而使用触发器如果中间出现错误的话,数据库会自动回滚,就不会有数据不完整的问题。

黄舟

数据库支持级联删除,但一般不建议使用,风险太大,而且这些逻辑最好在业务层处理。

CREATE TABLE child (
    id INT,
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON DELETE CASCADE
) ENGINE=INNODB;
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号