문제
나는 두 개의 테이블이 있습니다. 그 테이블은 그들 사이에 두 가지 관계가 있습니다.
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)
표 2에서 삭제 세트 NULL에 사용할 수 있다는 것을 알고 있습니다. 그런 다음 ID_XPTO2에서 NULL 값으로 모든 행을 검색하여 삭제할 수 있지만 DBA는 사용하지 않습니다.
이 과정을 수행하는 더 나은 솔루션이 있습니까?
해결책
다음 옵션이 있습니다.
지금하고있는 것처럼 두 가지 진술로 삭제하십시오. 먼저 표 2에서 삭제하십시오.
데이터베이스 브랜드가 멀티 테이블을 지원하는 경우 한 명령문에서 두 테이블에서 삭제
DELETE
구문 (예 : MySQL). 이것은 표준 SQL이 아니지만 편리합니다.계단식 참조 무결성 제약 조건을 사용합니다 (귀하의 DBA 가이 옵션을 Nix에 찍은 것을 이해합니다).
방아쇠를 작성하십시오
BEFORE DELETE
표 1에서, 표 2에서 참조를 삭제하거나 설정합니다. Cascading RI 제약보다 더 수용 가능한지 확인하려면 DBA에 확인하십시오.
마지막으로, 나는 당신의 DBA와 대화하고 당신이 여기서 요청한 것과 같은 질문을하는 것이 좋습니다. 사용하기를 원하는 솔루션을 찾으십시오. StackoverFlow의 사람들은 기술적 인 질문에 대답 할 수 있지만, 당신이 IT 정책 질문.
다른 팁
사용 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