目的
INSERT文で列に対する値が指定されなかった場合には、そのフィールドにユーザー定義のデフォルト値が挿入されることを指定します。
構文
- constant_value
- INSERT文の列リストの指定でターゲット テーブルの列を省略した場合に挿入されるデフォルト値。
- DATE
- 挿入デフォルト値としての日付値(ANSI DATEリテラル形式)。
- TIME
- 挿入デフォルト値としての時刻値(ANSI TIMEリテラル形式)。
- TIMESTAMP
- 挿入デフォルト値としてのタイムスタンプ値(ANSI TIMESTAMPリテラル形式)。
- INTERVAL
- 挿入デフォルト値としての間隔(Interval)値(ANSI INTERVAL形式)。
- quotestring
- 文字列として表現される単一引用符で囲まれたデフォルト値。
- sign
- 間隔値の符号。
- qualifier
- 以下のいずれかの期間を表わす間隔。
- YEAR
- YEAR TO MONTH
- MONTH
- DAY
- DAY TO HOUR
- DAY TO MINUTE
- DAY TO SECOND
- HOUR
- HOUR TO MINUTE
- HOUR TO SECOND
- MINUTE
- MINUTE TO SECOND
- SECOND
DEFAULTおよびINSERT
DEFAULT VALUESという形式の列式を挿入しようとした場合に、テーブルのいずれかの列にDEFAULT値が定義されていない場合、エラーが返されます。
値が省略されているcolumn_listを明示的に挿入しようとする場合に、省略された列にDEFAULTが定義されていない場合や、その列がNOT NULLで宣言されている場合には、エラーが返されます。
DEFAULTおよびPERIODデータ型
- DEFAULT NULL
- DEFAULT値
指定された値は、PERIODリテラルまたは期間値のコンストラクタでなければなりません。
期間値のコンストラクタがデフォルト値の指定に使用されるときには、次のルールが適用されます。- デフォルト値として、期間値のコンストラクタと単一の引数を使用してはいけません。そうでないと、エラーが報告されます。
- 開始境界は、日付/時刻リテラル、DATE、CURRENT_DATE、またはCURRENT_TIMESTAMP[(n)]を使用して指定しなければなりません。そうでないと、エラーが報告されます。
- 開始境界が日付/時刻リテラルの場合、終了境界は日付/時刻リテラルを使用して指定しなければなりません。開始境界にDATEまたはTIMESTAMPデータ型がある場合、終了境界はUNTIL_CHANGEDでなければなりません。そうでないと、エラーが報告されます。
- 開始境界がDATE、CURRENT_DATE、またはCURRENT_TIMESTAMP[(n)]の場合、終了境界はUNTIL_CHANGED、またはUNTIL_CHANGEDと同等の値を指定する日付/時刻リテラルでなければなりません。そうでないと、エラーが報告されます。
- DEFAULT USER
- DEFAULT DATE
- DEFAULT TIME
- DEFAULT CURRENT_DATE
- DEFAULT CURRENT_TIME[(n)]
- DEFAULT CURRENT_TIMESTAMP[(n)]
列データ型とDEFAULT値
デフォルト値は、その挿入先の列に指定されたデータ型と互換性がなければなりません。例えば、INTEGER DEFAULT 3.5という句は無効であり、エラーが返されます。
CREATE/ALTER TABLE文で指定されるデフォルト値が列のデータ型と異なる場合、日付/時刻データ型に対して、Teradata Databaseは暗黙の変換を実行します。例えば、次の文は有効です。
CREATE TABLE tab1 (F1 INT, F2 TIMESTAMP(0) DEFAULT CURRENT_DATE);
次の表は、それぞれのタイプの列に指定できるデフォルト値です。
列のデータ型 | サポートされるデフォルト値 |
---|---|
DATE | CURRENT_DATE |
CURRENT_TIMESTAMP | |
日付(DATE)リテラル | |
タイムスタンプ (TIMESTAMP) リテラル | |
TIME | CURRENT_TIME |
CURRENT_TIMESTAMP | |
時刻(TIME)リテラル | |
タイムスタンプ (TIMESTAMP) リテラル | |
TIMESTAMP | CURRENT_DATE |
CURRENT_TIME | |
CURRENT_TIMESTAMP | |
日付(DATE)リテラル | |
時刻(TIME)リテラル | |
タイムスタンプ (TIMESTAMP) リテラル |
- CREATE TABLE tab2 (i INT, j INTERVAL DAY DEFAULT 4);
- CREATE TABLE tab3 (i INT, j INTERVAL HOUR TO MINUTE DEFAULT '11:23' );
日付/時刻データ型の暗黙の変換についての詳細は、<Teradata Vantage™ SQL関数、式、および述部、B035-1145>の「データ型の変換」を参照してください。
文字の列に対するデフォルト値(キーワードを除く)は、列またはセッションの文字セットに定義されている文字データ型のレパートリーに属している必要があります。
ALTER TABLE文では、DEFAULT句をキーワードと共に使用して、事前に定義された値を無効にすることができます。
サポートされないデータ型
- BLOBまたはCLOB
- UDT(DEFAULT NULLは除く)
DEFAULT値とCHECK制約
デフォルト値は、その列に指定されたCHECK制約を超えてはなりません。デフォルト値がCHECK制約に違反しても、テーブルの定義または変更時点では矛盾は認識されません。矛盾が認識されされるのは、最初にINSERTまたはUPDATEがNULL値を入力し、そのNULL値がデフォルトに置き換えられたときです。
文字データの場合、制約は現在のセッション照合を使用してチェックされます。このため、デフォルト値がある照合では制約を満たし、別の照合では制約に違反することがあります。
DEFAULT値と識別列
DEFAULT属性をID列に対して指定することはできません。
DEFAULT値とビルトイン関数
constant_valueとして使用されるキーワードは、システム日付、システム時刻、またはユーザー定義の列の名前などのシステムがすでに知っている文字列を挿入します。
Teradata SQLの組込み関数であるDATEとTIMEは、デフォルト値として使用しないことになりました。この2つの関数はANSI標準に入っていません。下位互換性の確保という目的で残されてはいますが、ANSI標準のCURRENT_DATEとCURRENT_TIMEを使用してください。
DEFAULT値の最大長
constant_valueの最大長は、文字列の場合、510文字です。バイト列の場合は、510バイトです。
DEFAULT句のシステム値
TeradataのWITH DEFAULT句とは異なり、DEFAULT句にはシステムのデフォルト値はありません。
DEFAULT句のキーワードの値
以下のテーブルに、DEFAULT句の形式、各変数またはキーワードによって実行される機能、および対応するデフォルトのデータ型を示します。
形式 | 挿入内容 | 使用するデータ型 |
---|---|---|
DEFAULT constant_value | 列のデフォルトと定義されている値 | テーブルの列に定義されているタイプ |
DEFAULT DATE quotestring | quotestringによって列のデフォルト値として指定される日付値 | DATE |
DEFAULT NULL | NULL | なし |
DEFAULT CURRENT_DATE | 現在のシステム日付 | DATE |
DEFAULT CURRENT_TIME | 現在のシステム時刻 | TIME |
DEFAULT CURRENT_TIMESTAMP | 現在のシステム日付/時刻 | TIMESTAMP |
DEFAULT USER (ANSI規格に対するTeradataの拡張機能) |
現在のユーザーのユーザー名 | CHAR(n) CHARACTER SET UNICODE VARCHAR(n) CHARACTER SET UNICODE nはユーザー名として可能な長さの最大値。 |
CREATE TABLEまたはALTER TABLE ADD文にNOT NULL句と共にDEFAULT NULLが指定された場合、その文についてのエラーまたは警告のメッセージは表示されません。ただし、INSERTまたはUPDATEがヌルを最初に入力しようとしたときに、エラーが発生します。
次のように、ブランクなどのリテラル値を列のDEFAULTとして指定することができます。
CHAR(1) DEFAULT ' ' ...
例: 数値
DepartmentsテーブルでDeptNo列が以下のように定義されていると仮定します。
CREATE TABLE Departments (DeptName CHARACTER(36) ,DeptNo SMALLINT DEFAULT 100 FORMAT '999' BETWEEN 100 AND 900 ,ManagerID INTEGER);
INSERT文でDeptNoフィールドの値が指定されない場合には、自動的に値100がSMALLINTタイプで挿入されます。
例: 日付リテラル
以下に示すのは、DATE列にデフォルトの日付リテラルを指定した例です。
F4 DATE DEFAULT DATE '2000-01-01'
例: 現在の時刻
次に示すのは、TIME列にデフォルトとして現在時刻を指定した例です。
Stage TIME(3) DEFAULT CURRENT_TIME(3)
例: 間隔
次に示すのは、INTERVAL列にデフォルトの間隔(Interval)値を指定した例です。
Scale INTERVAL YEAR(2) DEFAULT INTERVAL -'10' YEAR