DEFAULT
テーブルには、ヌル値を許可しない列が 1 つ以上ある場合があります。エラーを回避するために、新しいレコードのそれらの列が必ず有効な値を持つよう、列のデフォルト値を定義しておくことは有用です。これを行うには、列定義の CREATE または ALTER で DEFAULT キーワードを使用して、INSERT および UPDATE ステートメントで使用される列値を設定します。この値は、次の一方または両方に当てはまる場合に使用されます。
•明確な列値が指定されていない。
•列ではバイナリ ゼロを使用できず、ヌル以外の有効な値を必要とする。
デフォルトの列値を定義すると、行を挿入または更新するときに VALUES 句で DEFAULT キーワードを使用すれば、その値を指定することができます。
要約すると、DEFAULT キーワードは次の場合に使用することができます。
•CREATE TABLE の列定義
•ALTER TABLE の列定義
•INSERT の VALUES 句
•UPDATE の VALUES 句
デフォルト値はリテラルまたは式です。CREATE TABLE または ALTER TABLE ステートメントでは、次の条件を満たしている必要があります。
•列のデータ型と一致している
•列に設定されている範囲や長さなどの制約に従っている
INSERT および UPDATE ステートメントでは、DEFAULT 式が定義されている列については、Zen が式を評価し、その結果を挿入または更新時に書き込みます。INSERT の場合、既存レコードの列は変更されないことに留意してください。
構文
DEFAULT キーワードの使用については、次のステートメントの構文を参照してください。
備考
次のトピックで説明されているあらゆる列に対して、DEFAULT としてリテラル値や式を指定することができます。
IDENTITY データ型の制限
CREATE TABLE ステートメントまたは ALTER TABLE ステートメントでは、IDENTITY、SMALLIDENTITY、BIGIDENTITY データ型にデフォルト値ゼロ(DEFAULT 0 または DEFAULT '0')を設定することができます。これらのデータ型では、それ以外のデフォルト値は許可されません。
列のデフォルト値としてのスカラー関数および単純な式
Zen では、リテラル値やヌル値のほかに、列と同じデータ型の値を返しさえすれば、スカラー関数や単純な式を使用して DEFAULT 値を定義することができます。たとえば、CHAR や VARCHAR の文字列型の列に USER() を使用することができます。新しい INSERT ステートメントおよび UPDATE ステートメントでそれが使用されたときに、戻り値が評価されます。
次の例は、DEFAULT として単純な式やさまざまなスカラー関数を使用する方法を示します。
CREATE TABLE DEFAULTSAMPLE (
a INT DEFAULT 100,
b DOUBLE DEFAULT PI(),
c DATETIME DEFAULT NOW(),
d CHAR(20) DEFAULT USER(),
e VARCHAR(10) DEFAULT UPPER(DAYNAME(CURDATE())),
f VARCHAR(40) DEFAULT '{'+CONVERT(NEWID(),SQL_VARCHAR)+'}',
g INTEGER DEFAULT DAYOFYEAR(NOW())
);
INSERT INTO DEFAULTSAMPLE DEFAULT VALUES;
SELECT * FROM TX;
a b c d
=========== ======================= ============================== ===================
100 3.141592653589793 2021-11-12 17:25:59.288 Master
e f g
========= ======================================= ==========
FRIDAY {EF66F711-36D2-40FA-B928-BAFCC486DA6B} 316
ALTER TABLE での DEFAULT の使用
ALTER TABLE を使用して、DEFAULT 属性を追加するように列定義を変更する場合は、その列に定義済みのすべての属性を含める必要があります。これは、ALTER TABLE を使用して列を変更すると、既存の定義に属性を追加するのではなく、既存の定義を置き換えるからです。また、次の例に示すように、列を変更して DEFAULT 値を変えても、既存の値には影響しません。
CREATE TABLE Tab10 (a INT, b CHAR(20) CASE); --列 b は大文字小文字を無視します
ALTER TABLE Tab10 ALTER COLUMN b CHAR(20) DEFAULT 'xyz'; --列 b はデフォルト値を持ちますが、大文字小文字を無視しなくなりました
INSERT INTO Tab10 DEFAULT VALUES;
SELECT * FROM Tab10;
a b
=========== ====================
(Null) xyz
1 行が影響を受けました。
SELECT * FROM Tab10 WHERE b = 'XYZ'; --大文字小文字が一致しないので、行は返されません
a b
=========== ====================
0 行が影響を受けました。
ALTER TABLE Tab10 ALTER COLUMN b CHAR(20) CASE DEFAULT 'xyz'; --列 b は大文字小文字を無視し、「かつ」デフォルト値を持つようになりました
SELECT * FROM Tab10 WHERE b = 'XYZ'; --大文字小文字が一致する必要はありません
a b
=========== ====================
(Null) xyz
1 行が影響を受けました。
例
次のステートメントはテーブル Tab5 を作成します。列 col5 のデフォルト値は 200 とします。
CREATE TABLE Tab5
(col5 INT DEFAULT 200)
============
次のステートメントはテーブル Tab1 を作成し、列 col1 は NOW() から返された結果の DATE 部分とします。
CREATE TABLE Tab1
(col1 DATE DEFAULT NOW())
============
次のステートメントはテーブル Tab8 を作成し、列 col8 は、INSERT または UPDATE ステートメントの実行時間とします。
CREATE TABLE Tab8
(col8 TIMESTAMP DEFAULT CURRENT_TIMESTAMP())
============
次のステートメントはテーブル Tab6 を作成し、列 col6 は、INSERT または UPDATE ステートメント実行後のユーザー名とします。DEFAULT USER を実際に利用できるのは、セキュリティが有効になっている場合のみです。有効になっていない場合、USER は常にヌルです。キーワード USER は USER() 関数と同じ結果をもたらします。
CREATE TABLE Tab6
(col6 VARCHAR(20) DEFAULT USER)
============
次のステートメントは無効な例を示しています。TIME は DATE 列で許可されているデータ型ではないため、解析時エラーになります。
CREATE TABLE Tab
(col DATE DEFAULT CURTIME())
============
次のステートメントは無効な例を示しています。'3.1' は数値に変換できますが、それは有効な整数ではないため、解析時エラーになります。
CREATE TABLE Tab
(col SMALLINT DEFAULT '3.1')
============
次のステートメントは無効な例を示しています。CREATE TABLE ステートメントは成功しますが、-60000 は SMALLINT でサポートされる値の範囲外であるため、INSERT ステートメントは失敗します。
CREATE TABLE Tab
(col SMALLINT DEFAULT 3 * -20000)
INSERT INTO Tab values(DEFAULT)
============
次のステートメントは、IDENTITY および SMALLIDENTITY データ型にデフォルト値ゼロを設定する正しい例を示しています。
CREATE TABLE t1 ( c1 IDENTITY DEFAULT '0' )
ALTER TABLE t1 ALTER c1 SMALLIDENTITY DEFAULT 0
============
次のステートメントは、IDENTITY および SMALLIDENTITY データ型にデフォルト値を設定する無効な例を示しています。
CREATE TABLE t1 ( c1 IDENTITY DEFAULT 3 )
ALTER TABLE t1 ALTER c1 SMALLIDENTITY DEFAULT 1
関連項目