FOREIGN KEY 를 명시하면 참조하는 테이블에 있는 값만 가능하게 된다.
여기까지만 알고있었다.
자료변경(UPDATE/DELETE) 시에 무식하게 일일이 수정하는 만행을 저지르곤 했다.
ON 이라는 키워드가 존재할 줄이야.

 FOREIGN KEY(fStoreId,fSerial) REFERENCES TBLREQUEST(fStoreId,fSerial)
   ON UPDATE CASCADE
   ON DELETE NO ACTION

첫줄은 이미 알던 개념이었다.
ON UPDATE: 업데이트 시
ON DELETE: 삭제 시

CASCADE 의 사전 의미는 "[컴퓨터] 층계형" 이다.
TBLREQUEST 의 각 키가 변경이 되면 FOREIGN KEY 로 연결되어있는 모든 것에 대하여
단계별로 변경사항을 적용시킨다.
많은 외부키 참조가 되어있는 경우 참조 수 만큼 행해줘야 했던 처리를
원 자료에 대해 적용하면 자동으로 처리가 된다. 좋다.

NO ACTION 은 아무 일도 하지 말라는 것이다.
이렇게 하면 참조된 자료를 다 삭제하기 전에는 제약조건에 의해 삭제가 불가능 해진다.

'Windows > Database' 카테고리의 다른 글

[SQL] 테이블간 자료 이동간 데이터 명시  (0) 2007.06.01
[SQL] UNION  (0) 2007.05.19
Table1, Table2 가 있다.
Table1 의 자료를 Table2 로 이동하려고 한다.

각 단계는
1. Table1 의 자료를 Table2 에 기록
2. Table1 의 자료 삭제
로 이루어진다.

이때, 1단계와 2단계 사이에 Table1 에 대한 INSERT 작업이 이루어지면
2단계에서 후에 기록된 자료까지 삭제가 된다.
Transaction 을 적용하더라도 그렇게 된다.

그러므로 이동시에는 전체 자료에 대한 표현을 쓰지말고 특정 데이타를 명시적으로 표시하여야 한다.

예제 코드)
procedure Button1Click( Sender: TObject);
var
  nCount : Integer;
begin
  try
    Conn1.BeginTrans;

    Conn1.Execute( 'INSERT INTO Table2(fDesc) SELECT fDesc FROM Table1', nCount );

    Conn2.Execute( 'INSERT INTO Table1(fDesc) VALUES(''TEST'')', nCount );

    Conn1.Execute( 'DELETE FROM Table1', nCount );

    Conn1.CommitTrans;
  except
    Conn1.RollbackTrans;
  end;
end;

'Windows > Database' 카테고리의 다른 글

[SQL] FOREIGN KEY 제약조건  (0) 2007.08.22
[SQL] UNION  (0) 2007.05.19

두개의 테이블을 UNION 할 때 필드의 순서가 같아야한다.

같은 내용의 테이블이 두개 있는데,
필드의 순서가 달라서 UNION 을 적용하니 VARCHAR 에러가 난 것이다.
결국 필드명을 순서대로 명시 해 줘야 UNION 이 가능한 경우이다.

'Windows > Database' 카테고리의 다른 글

[SQL] FOREIGN KEY 제약조건  (0) 2007.08.22
[SQL] 테이블간 자료 이동간 데이터 명시  (0) 2007.06.01

+ Recent posts