別のテーブルから新しいテーブルにデータを一括挿入する際に問題が発生しました。ターゲットは次のように見えました。
CREATE TABLE TEST_T (
T_GUID RAW(16) DEFAULT SYS_GUID() NOT NULL,
T_VAL1 NUMBER(10) NOT NULL,
T_VAL2 VARCHAR2(10) NOT NULL,
PRIMARY KEY (T_GUID)
)
データを入力するつもりだったステートメントの簡略化されたバージョン:
INSERT INTO TEST_T (T_VAL1, T_VAL2)
SELECT DISTINCT
CAST(SUBSTR(zip_code, 1,1) AS NUMBER) as t_val1,
zip_code as t_val2
FROM OTHER_TABLE_T
WHERE ...
ORDER BY t_val1
私は値を提供していないので、新しい行ごとT_GUID
に関数によって提供されるものを取得すると想定していました。SYS_GUID
しかし、何かがうまくいかず、主キーの一意性制約違反が発生します。
を削除するDISTINCT
と、ステートメントは成功しますが、多くの重複エントリが取得されます。もちろん、 my で明示的にSYS_GUID()
呼び出しを提供すると、SELECT
まったく同じ結果になります。
ここで、単に別のものを自分のSELECT
周りに配置すると、問題なく動作し、制約違反がなく、個別の行が挿入されることがわかりました。
INSERT INTO ...
SELECT x.* FROM (
SELECT DISTINCT ...
) x
では、重複する GUID はどこから来るのでしょうか? 行の完全なセットに問題がない場合、なぜ個別に行を削除すると問題が発生するのでしょうか? SYS_GUID は呼び出しごとに一意の識別子を作成するため、明確なケースでは、句全体に対して 1 回だけ呼び出され、周囲のラッピングによって解決されるとしか想像できませんでしたSELECT
。その場合の実行の違いを誰かが説明してくれれば、とてもうれしいです。