문제

나는 두 개의 테이블이 있습니다. 그 테이블은 그들 사이에 두 가지 관계가 있습니다.

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

내가 알고있는 두 가지 방법 :

  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