助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26559
問題を開く
次のSQL文のうち、エラーとなるものはどれですか(該当するものを全て選択して下さい)。

正解

CREATE TABLE temp
(
 id NUMBER(2) CONSTRAINT temp_uq UNIQUE (id, name),
 name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
 birth DATE
);

CREATE TABLE temp
(
 id NUMBER(2) CONSTRAINT id_uq UNIQUE,
 name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
 birth DATE,
 CONSTRAINT temp_uq UNIQUE
);

解説

UNIQUE制約は列レベル、表レベルのどちらでも定義することができますが、複数の列の組合せに対してUNIQUE制約を定義する場合は、表レベルで定義しなければなりません。
また、表レベルで制約を定義する場合は、制約を定義する列を指定しなければなりません。

以上より、
・CREATE TABLE temp
(
 id NUMBER(2) CONSTRAINT temp_uq UNIQUE (id, name),
 name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
 birth DATE
);
・CREATE TABLE temp
(
 id NUMBER(2) CONSTRAINT id_uq UNIQUE,
 name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
 birth DATE,
 CONSTRAINT temp_uq UNIQUE
);
が正解となります。

正解のSQL文の実行結果は次のようになります。


 

SQLを表示
CREATE TABLE temp
(id NUMBER(2) CONSTRAINT temp_uq UNIQUE (id, name),
name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
birth DATE
);



 
SQLを表示
CREATE TABLE temp
(id NUMBER(2) CONSTRAINT id_uq UNIQUE,
name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
birth DATE,
CONSTRAINT temp_uq UNIQUE
);


参考:
列または列の組合せにUNIQUE制約を定義すると、定義された列または列の組合せに重複したデータを登録することができなくなります。ただしNULL値は登録することができ、複数の行にNULL値を登録する事もできます。


 
SQLを表示
CREATE TABLE temp
(id NUMBER(2) CONSTRAINT id_uq UNIQUE,
name VARCHAR2(10)
);

INSERT INTO temp VALUES(1, 'Tanaka');

INSERT INTO temp VALUES(1, 'Sasaki');



 
SQLを表示
INSERT INTO temp VALUES (NULL, 'Yamada');

INSERT INTO temp VALUES (NULL, 'Ishii');

SELECT * FROM temp;


複数の列の組合せに対してUNIQUE制約を定義する場合は、表レベルで定義しなければなりません。


 
SQLを表示
CREATE TABLE temp
(id NUMBER(2),
name VARCHAR2(10),
CONSTRAINT temp_uq UNIQUE (id, name)
);

INSERT INTO temp VALUES (1, 'Tanaka');

INSERT INTO temp VALUES (1, 'Sasaki');

INSERT INTO temp VALUES (1, 'Sasaki');


なお、UNIQUE制約を定義すると、自動的に制約と同じ名前の一意索引が作成されます。


 
SQLを表示
CREATE TABLE temp
(id NUMBER(2) CONSTRAINT id_uq UNIQUE,
name VARCHAR2(10)
);

SELECT index_name, table_name
FROM user_ind_columns;


[索引の確認方法]
ログインユーザーが所有する索引(自動的に作成された索引を含む)の情報を調べるには、USER_IND_COLUMNSデータ・ディクショナリを参照します。
USER_IND_COLUMNSデータ・ディクショナリには索引名や索引を作成した表名、列名などの情報が登録されています。

上に戻る

一意制約について教えてください。

公開日 2023/02/01

以下の2つのCREATE文で、
列UNIQUE制約を付与してから複数列UNIQUE制約をつけるのと、
複数列UNIQUE制約のみの場合でどのように違うか教えてください。

CREATE TABLE temp
(
 id NUMBER(2) CONSTRAINT id_uq UNIQUE NOT NULL,
 name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
 birth DATE,
 CONSTRAINT temp_uq UNIQUE(id, name)
);

CREATE TABLE temp
(
 id NUMBER(2) CONSTRAINT id_uq NOT NULL,
 name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
 birth DATE,
 CONSTRAINT temp_uq UNIQUE(id, name)
);

2023/02/01 13:22

【列UNIQUE+複数列UNIQUE】

CREATE TABLE temp2
(
 id NUMBER(2) CONSTRAINT id_uq2 UNIQUE NOT NULL,
 name VARCHAR2(10) CONSTRAINT name2_nn NOT NULL,
 CONSTRAINT temp_uq UNIQUE(id, name)
);

この場合、id列単体でも一意である必要があります。
insert into temp2 values(1,'aaa'); ・・OK
insert into temp2 values(1,'bbb'); ・・エラー
insert into temp2 values(1,'bbb'); ・・エラー

【複数列UNIQUE のみ】

CREATE TABLE temp3
(
 id NUMBER(2) CONSTRAINT id_uq  NOT NULL,
 name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
 CONSTRAINT temp_uq UNIQUE(id, name)
);

この場合、id列単体では一意である必要が無いです。
insert into temp3 values(1,'aaa'); ・・OK
insert into temp3 values(1,'bbb'); ・・OK
insert into temp3 values(1,'bbb'); ・・エラー

疑問点は無料で使えるLive SQLで色々試してみると良いですよ。


コメント

M Mottchan

2023/02/06 11:08

ありがとうございます。助かります。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?