题
我有两个表格。这些表格有两个之间的关系。
Table 1
* ID_XPTO (PK)
* Detail
Table 2
* ID_XPTO (FK) (PK)
* ID_XPTO2 (FK) (PK)
这两个关系存在。
Table 1 -< Table2
Table 1 -< Table2
我的问题是,我需要删除一些列在表1。目前,我正在做,
declare @table Table (xptoTable2 int)
insert into @table
select ID_XPTO2
from Table2
where ID_XPTO = @ID_XPTO
delete from Table2
where ID_XPTO = @ID_XPTO
delete from Table
where ID_XPTO in (select xptoTable2from @table)
我知道,我可以用于删除置NULL在表2.在这种方式我可以搜索的所有行空值在ID_XPTO2并删除它们,但DBA不要使用它。
是不是有更好的解决方案做到这一进程?
解决方案
你有这些选项:
删除两个发言,因为你正在做的现在。Delete from Table2第一次。
删除两个表中的一句话,如果你的品牌的数据库支持多表
DELETE
语法(例如MySQL).这不是标准SQL,但它是很方便的。使用联引用完整性限制(我理解你的DBA已经否决了这个选项)。
编写一个触发器
BEFORE DELETE
在表1中,删除或落空的任何参考表2.检查你的DBA看到如果这是任何更多的可以接受超级联RI的约束。
最后,我劝说你的DBA和问同样的问题你问这里。找出是什么解决方案时,他/她会喜欢你的用途。伙计在计算器可以回答技术性问题,但它听起来就像你正在处理一个 它的政策问题.
其他提示
使用ON DELETE CASCADE
。它会自动的删除的引用行。
为什么你不用 ON DELETE CASCASE
?
DROP TABLE t_f
DROP TABLE t_m
CREATE TABLE t_m (id INT NOT NULL IDENTITY PRIMARY KEY , value VARCHAR(50))
CREATE TABLE t_f (id INT NOT NULL IDENTITY PRIMARY KEY, m INT, CONSTRAINT fk_m FOREIGN KEY (m) REFERENCES t_m(id) ON DELETE CASCADE)
INSERT INTO t_m (value) VALUES ('test')
INSERT INTO t_f (m) VALUES (1)
DELETE FROM t_m
SELECT * FROM t_m
SELECT * FROM t_f
id value
------------ ------
0 rows selected
id m
------------ ------
0 rows selected
两个方法我知道:
你可以使用的上级联删除
写你SQL清理后,本身即:
DECLARE @DetailCriteria ... SET @DetailCriteria = '....' BEGIN TRAN -- First clear the Table2 of any child records DELETE FROM Table2 WHERE ID_XPTO IN (SELECT ID_XPTO FROM Table1 WHERE Detail = @DetailCriteria) OR ID_XPTO2 IN (SELECT ID_XPTO FROM Table1 WHERE Detail = @DetailCriteria) -- Next clear Table2 (which will delete fine because you've followed the referential chain) DELETE FROM Table1 WHERE Detail = @DetailCriteria -- commit if you're happy (should check @@ERROR first) COMMIT
不隶属于 StackOverflow