LoginSignup
0
0

More than 1 year has passed since last update.

CREATE TABLE文のDEFAULT ON NULL句を試す(Oracle Database 12c)

Last updated at Posted at 2018-05-14

Oracle Database 12cの新機能CREATE TABLE / ALTER TABLE文の列に指定するON NULL句を試します。

列のデフォルト値

テーブルに対してINSERT文を実行した場合、値を指定しない列の値はNULL値になります。下記の例ではINSERT文でc1列を省略しているため、NULL値が格納されています。

SQL> CREATE TABLE def1(c1 NUMBER, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def1(c2) VALUES('data1');

1行が作成されました。

SQL> SET NULL NULL
SQL> SELECT * FROM def1;

        C1 C2
---------- ----------
NULL       data1

DEFAULTの指定

省略時に自動的に指定を行う場合には列に対してDEFAULTを指定します。
下記の例ではc1列が省略されていた場合には100を格納します。

SQL> CREATE TABLE def2(c1 NUMBER DEFAULT 100, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def2(c2) VALUES('default1');

1行が作成されました。

SQL> SELECT * FROM def2;

        C1 C2
---------- ----------
       100 default1

DEFAULTにはリテラル値だけでなく、シーケンスも指定することができます。

SQL> CREATE SEQUENCE seq1;

順序が作成されました。

SQL> CREATE TABLE def3(c1 NUMBER DEFAULT seq1.NEXTVAL, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def3(c2) VALUES ('sequence1');

1行が作成されました。

SQL> INSERT INTO def3(c2) VALUES ('sequence2');

1行が作成されました。

SQL> SELECT * FROM def3;

        C1 C2
---------- ----------
         1 sequence1
         2 sequence2

DEFAULT指定は列値を指定しない場合の値なので、明示的にNULLを指定するとNULL値が格納されます。列にNOT NULL属性が指定されていた場合(またはPRIMARY KEY制約が指定されていた場合も)には、NULL値の入力はエラーになります。
下記の最初の例では強制的にNULL値が格納されています。次の例ではORA-01400が発生しています。

SQL> CREATE TABLE def4(c1 NUMBER DEFAULT 100, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def4 VALUES (NULL, 'nullval');

1行が作成されました。

SQL> SELECT * FROM def4;

        C1 C2
---------- ----------
NULL       nullval

SQL> CREATE TABLE def5(c1 NUMBER DEFAULT 100 NOT NULL, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def5 VALUES(NULL, 'nullval');
INSERT INTO def5 VALUES(NULL, 'nullval')
                         *
行1でエラーが発生しました。:
ORA-01400: ("SCOTT"."DEF5"."C1")にはNULLは挿入できません。

ON NULL句の指定

DEFAULT句にON NULL句を追加すると、省略時と同様に、NULL値が指定された場合でもに強制的に入力される値を指定することができます。
下記の例ではテーブル作成時にDEFAULT ON NULL 20を指定しているため、c1列に対してNULLを指定された場合でも20が格納されています。

SQL> CREATE TABLE def6(c1 NUMBER DEFAULT ON NULL 20 NOT NULL, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def6 VALUES(NULL, 'nullval');

1行が作成されました。

SQL> SELECT * FROM def6;

        C1 C2
---------- ----------
        20 nullval
0
0
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
0