助け合いフォーラム
正解
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
);
解説
また、表レベルで制約を定義する場合は、制約を定義する列を指定しなければなりません。
以上より、
・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文の実行結果は次のようになります。
(id NUMBER(2) CONSTRAINT temp_uq UNIQUE (id, name),
name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
birth DATE
);
(id NUMBER(2) CONSTRAINT id_uq UNIQUE,
name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
birth DATE,
CONSTRAINT temp_uq UNIQUE
);
参考:
列または列の組合せにUNIQUE制約を定義すると、定義された列または列の組合せに重複したデータを登録することができなくなります。ただしNULL値は登録することができ、複数の行にNULL値を登録する事もできます。
(id NUMBER(2) CONSTRAINT id_uq UNIQUE,
name VARCHAR2(10)
);
INSERT INTO temp VALUES(1, 'Tanaka');
INSERT INTO temp VALUES(1, 'Sasaki');
INSERT INTO temp VALUES (NULL, 'Ishii');
SELECT * FROM temp;
複数の列の組合せに対してUNIQUE制約を定義する場合は、表レベルで定義しなければなりません。
(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制約を定義すると、自動的に制約と同じ名前の一意索引が作成されます。
(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データ・ディクショナリには索引名や索引を作成した表名、列名などの情報が登録されています。
一意制約について教えてください。
以下の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)
);
【列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
ありがとうございます。助かります。