11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FOREIGN KEY 外部キー ON DELETE CASCADE の有無での動作確認

Last updated at Posted at 2018-07-07

FOREIGN KEY 外部キー(外部参照キー) はDELETE の動作を記述していないので、このページではその部分を記載する。

SQL
-- 準備
CREATE TABLE PARENTS  -- 親
    (
    PARENT_ID   NUMBER(1)  NOT NULL  -- 親ID
  , CONSTRAINT PARENTS_PK PRIMARY KEY(PARENT_ID) USING INDEX  -- PRIMARY KEY
    ) ;

CREATE TABLE CHILDREN  -- 子
    (
    PARENT_ID  NUMBER(1) NOT NULL  -- 親ID
  , CHILD_ID   NUMBER(1) NOT NULL  -- 子ID
  , CONSTRAINT CHILDREN_PK PRIMARY KEY(PARENT_ID, CHILD_ID) USING INDEX  -- PRIMARY KEY
  , CONSTRAINT CHILDREN_PARENTS_FK
        FOREIGN KEY(PARENT_ID) REFERENCES PARENTS(PARENT_ID)
        ON DELETE CASCADE  -- 親テーブルをDELETEすれば、それに紐付く子テーブルもいっしょにDELETEされる
    ) ;
SQL
-- データを用意
INSERT INTO PARENTS(PARENT_ID) VALUES(1) ;
INSERT INTO PARENTS(PARENT_ID) VALUES(2) ;
INSERT INTO PARENTS(PARENT_ID) VALUES(3) ;
INSERT INTO PARENTS(PARENT_ID) VALUES(4) ;
INSERT INTO CHILDREN(PARENT_ID, CHILD_ID) VALUES(1, 1) ;
INSERT INTO CHILDREN(PARENT_ID, CHILD_ID) VALUES(1, 2) ;
INSERT INTO CHILDREN(PARENT_ID, CHILD_ID) VALUES(2, 1) ;
INSERT INTO CHILDREN(PARENT_ID, CHILD_ID) VALUES(3, 1) ;
INSERT INTO CHILDREN(PARENT_ID, CHILD_ID) VALUES(3, 2) ;
INSERT INTO CHILDREN(PARENT_ID, CHILD_ID) VALUES(3, 3) ;
INSERT INTO CHILDREN(PARENT_ID, CHILD_ID) VALUES(4, 1) ;
COMMIT ;
SQL
SQL> -- PARENT_ID = 1 の親データを子データと共にDELETEする
SQL> DELETE FROM PARENTS PS WHERE PS.PARENT_ID = 1 ;

1行が削除されました。
SQL
SQL> -- DELETEされたことを確認
SQL> SELECT * FROM PARENTS ;

    PARENT_ID
-------------
            2
            3
            4

3行が選択されました。

SQL> SELECT * FROM CHILDREN ;

    PARENT_ID      CHILD_ID
------------- -------------
            2             1
            3             1
            3             2
            3             3
            4             1

5行が選択されました。
SQL
SQL> -- COMMIT を忘れずに
SQL> COMMIT ;

コミットが完了しました。
SQL
SQL> -- いったん外部キーをDROP
SQL> ALTER TABLE CHILDREN DROP CONSTRAINT CHILDREN_PARENTS_FK ;

表が変更されました。
SQL
SQL> -- ON DELETE CASCADE なしで外部キーをADD
SQL> ALTER TABLE CHILDREN ADD CONSTRAINT CHILDREN_PARENTS_FK
  2      FOREIGN KEY(PARENT_ID) REFERENCES PARENTS(PARENT_ID) ;

表が変更されました。
SQL
SQL> -- PARENT_ID = 2 の親データを子データと共にDELETEする
SQL> DELETE FROM PARENTS PS WHERE PS.PARENT_ID = 2 ;

DELETE FROM PARENTS PS WHERE PS.PARENT_ID = 2
*
行1でエラーが発生しました。:
ORA-02292: 整合性制約(USERNAME1.CHILDREN_PARENTS_FK)に違反しました -
子レコードがあります

-- と子データがあるから親データをDELETEできないと怒られる。子データを先にDELETEする。
SQL> DELETE FROM CHILDREN CS WHERE CS.PARENT_ID = 2 ;

1行が削除されました。
SQL
SQL> -- 改めてPARENT_ID = 2 の親データをDELETEする
SQL> DELETE FROM PARENTS PS WHERE PS.PARENT_ID = 2 ;

1行が削除されました。
SQL
SQL> -- COMMIT を忘れずに
SQL> COMMIT ;

コミットが完了しました。
SQL
SQL> -- 改めてDELETEされたことを確認
SQL> SELECT * FROM PARENTS ;

    PARENT_ID
-------------
            3
            4

2行が選択されました。

SQL> SELECT * FROM CHILDREN ;

    PARENT_ID      CHILD_ID
------------- -------------
            3             1
            3             2
            3             3
            4             1

4行が選択されました。

Oracle12.1 SQL言語リファレンス constraint

以上。

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?