扫码关注官方订阅号
我有个分类表
还有个商品表
我想实现删除分类就删除这个分类下的所有商品 这个如何在数据库实现呢
认证0级讲师
外键是限制必须删除所有商品时才能删除这个分类吧;删除分类就删除所有的商品,是不是需要用个触发器。
没太研究过外键,我们的库不是程序自动生成的基本没有外键,数据维护起来太麻烦。
一般我们在做时就是当删除这个分类时查找商品里面有这个分类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;
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;
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
外键是限制必须删除所有商品时才能删除这个分类吧;
删除分类就删除所有的商品,是不是需要用个触发器。
没太研究过外键,我们的库不是程序自动生成的基本没有外键,数据维护起来太麻烦。
一般我们在做时就是当删除这个分类时查找商品里面有这个分类id的,直接删除就好了
就大学那会教sql server用过外键,现在没用过
使用触发器,个人认为没有必要。直接在程序端实现就可以了
MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户
进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。
详细的可以看mysql外键实战,希望对你有帮助(PS:楼主外健的健还是错别字,强迫症看着难受!!!)
这个的实现其实和外键没有关系,应该在数据库里面设置个触发器
除此之外,商品表应该是要有一个外键连接到分类表,如果是 MySQL 的话,可以执行下面的语句:
PS. MySQL 默认引擎 MyISAM 是不支持外键的,要使用外键需将引擎设置为 InnoDB :
ALTER TABLE `数据表名称` ENGINE = InnoDB;PSS. 楼上说没有必要用触发器,直接在程序端实现就可以的:如果在程序执行中因为某种因素被中断,那么就会导致数据不完整的问题出现,而使用触发器如果中间出现错误的话,数据库会自动回滚,就不会有数据不完整的问题。
数据库支持级联删除,但一般不建议使用,风险太大,而且这些逻辑最好在业务层处理。