0
1

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 3 years have passed since last update.

Oracle 同一キーを削除して一意にしたい(正しいROWIDの使い方)

Last updated at Posted at 2019-11-13
SQL
-- 準備
CREATE TABLE TABLE_NAME1
    (
    NUM1 NUMBER(6)
    )  ;
INSERT INTO TABLE_NAME1(NUM1) VALUES(10) ;
INSERT INTO TABLE_NAME1(NUM1) VALUES(10) ;
INSERT INTO TABLE_NAME1(NUM1) VALUES(10) ;
INSERT INTO TABLE_NAME1(NUM1) VALUES(20) ;
INSERT INTO TABLE_NAME1(NUM1) VALUES(20) ;
INSERT INTO TABLE_NAME1(NUM1) VALUES(30) ;
INSERT INTO TABLE_NAME1(NUM1) VALUES(30) ;
INSERT INTO TABLE_NAME1(NUM1) VALUES(40) ;
COMMIT ;

-- テーブルの内容を確認する。
SELECT T1.NUM1
FROM TABLE_NAME1 T1
ORDER BY T1.NUM1 ;

         NUM1
-------------
           10
           10
           10
           20
           20
           30
           30
           40

8行が選択されました。
SQL
-- このデータで NUM1 について同じ値が複数行あるものについて1行だけ残して、重複するデータをDELETEするSQLの書き方。
DELETE FROM TABLE_NAME1
WHERE ROWID NOT IN
    (
    SELECT MIN(ROWID) FROM TABLE_NAME1 T1 GROUP BY T1.NUM1
               -----
    ) ; 

4行が削除されました。

COMMIT ;

-- もう一度、テーブルの内容を確認する。
SELECT T1.NUM1
FROM TABLE_NAME1 T1
ORDER BY T1.NUM1 ;

      NUM1
----------
        10
        20
        30
        40

時々未熟なプログラマーがROWIDをPRIMARY KEYに使っているのを見かけるが、UPDATEを実行して行移行(元のROWIDとは変わってしまう)が起きたり、
exp/imp or expdp/impdp で当然ROWIDが変わってしまい、破綻するのを何度みたことか。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?