我有两个表格。这些表格有两个之间的关系。

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

两个方法我知道:

  1. 你可以使用的上级联删除

  2. 写你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
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top