sql 级联删除问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 级联删除问题相关的知识,希望对你有一定的参考价值。
用sqlServer做数据库开发网站,如果想删除某一栏目,当然得删除该栏目下的所有子栏目及文章的相关信息.综合安全及执行性能及维护来讲,下面的几个方案中哪一种方案较好?
1.使用数据库的级联删除
2.写触器
3.用存储过程,然后面应用程序中调用
望有开发经验的大虾不吝赐教
如果我只想在关系中建级联更新和级联删除,这样做行吗?
今后如果需要在删除/更新主表记录的时候加入用触发器或者级联删除/更新无法实现的其他操作的话,还是在程序中删除比较好,这样程序的逻辑比较集中,便于维护。 参考技术A 都差不多。个人比较倾向于存储过程,感觉使用比其他的方便 参考技术B 触发器..
相对于只是单独的删除要好一些 参考技术C mark
SQL删除级联帮助(具体问题)
【中文标题】SQL删除级联帮助(具体问题)【英文标题】:SQL Deletion Cascading Help (Specific Question) 【发布时间】:2008-11-06 21:49:51 【问题描述】:我在 HSQL 数据库中有两个具有多对多关系的表(为说明目的而重命名/重构)。我希望从多对多关系的一侧删除所有内容(不查询表;这对性能至关重要)
这是我的主要表格:
CREATE TABLE PERSON
(
PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
NAME VARCHAR(50)
)
CREATE TABLE JOB
(
JOB_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
NAME VARCHAR(50)
)
这是我的连接表:
CREATE TABLE JOB_PERSON
(
PERSON_ID INTEGER,
JOB_ID INTEGER
)
这是我的限制:
ALTER TABLE JOB_PERSON ADD
CONSTRAINT FK_PERSON_JOB FOREIGN KEY(PERSON_ID)
REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE
ALTER TABLE JOB_PERSON ADD
CONSTRAINT FK_JOB_PERSON FOREIGN KEY(JOB_ID)
REFERENCES JOB ON DELETE CASCADE ON UPDATE CASCADE
我基本上想这样做:“从 person_id=0 的人中删除”并让它从 PERSON、JOB_PERSON 和 JOB 中删除所有内容,如果 JOB 实体将被孤立(不再在多对多表中引用)
在不查询数据库的情况下这可能吗?当我删除时,它只会从 PERSON 和 JOB_PERSON 中删除。你可能会说,我的 sql 技能欠缺。
这是我一直在玩的虚拟数据:
insert into person values(null,'Arthur');
insert into person values(null,'James');
insert into job values(null, 'Programmer')
insert into job values(null, 'Manager')
insert into job_person values(0,0);
insert into job_person values(0,1);
insert into job_person values(1,1);
所以如果我输入这两个语句:
delete from person where person_id=0
delete from person where person_id=1
我想删除所有 3 个表中的所有内容。可能吗?
【问题讨论】:
【参考方案1】:创建一个您传递 ID 的存储过程,然后按您需要的顺序简单地删除正确的行。
通过这种方式,您的应用不会与确切的顺序相关联,这在未来可能会随着数据库的重新设计而改变。您还可以获得额外的好处,即存储过程比发送一堆查询更快。
虽然如果您在尝试删除该条目时绝对想要一种删除依赖表的方法,则必须使用触发器,但触发器的规则是,尽可能避免使用它们,如果存在其他解决方案,请使用它。所以最终,使用存储过程是最好的解决方案。
【讨论】:
以上是关于sql 级联删除问题的主要内容,如果未能解决你的问题,请参考以下文章