NULL許可の設計方針は「原則 NOT NULL、値がまだ無い・該当しないことに意味がある列だけ NULL を許可し、0 や空文字のダミー値では埋めない」です。 NULL は「値が無い」ことを表す印で、0 や空文字は「0 という値」「長さ0の文字列という値」です。この2つを混ぜると、件数や平均が意図と違う数字になります。

この記事では、列の種類ごとに NULL 可否とデフォルト値を決める早見表を示し、NULL・空文字・0 で集計・一意制約・絞り込み・並び順がどう変わるかを3つのデータベースで実行して比べます。あわせて「未入力」「該当なし」「不明」を区別する設計と、既存テーブルへ NOT NULL 列を後から足す手順を扱います。

確認環境:PostgreSQL 18.4、MySQL 8.0.46(InnoDB、sql_mode は既定の厳密モード)、SQLite 3.45.1(Python 3.11 の sqlite3)。Linux 上で 2026-10-06 に実行しました。出力例のデータベース名は appdb に置き換えています。

この記事の結論

  • 原則は NOT NULL。 迷ったら NOT NULL にして、NULL を許可する列には理由を1行で書けるようにします。
  • NULL を許可するのは「まだ値が無い」「この行には該当しない」ことに意味がある列だけです(完了日時、任意の外部キー、未回答の数量など)。
  • 0・空文字・'9999-12-31' のようなダミー値で NULL の代わりをしない。 AVG や件数に「値」として混ざります。
  • デフォルト値は「入力しなかったときに、その値で正しい」と言える列にだけ付けます(数量 0、フラグ false、登録日時 現在時刻)。
  • 「未入力」「該当なし」「不明」を分けたいときは、NULL 1つに意味を重ねず、状態を表す区分列を足します。

NULL可否とデフォルト値の早見表

列の種類 例 NULL 可否 デフォルト値 決め方の理由
名称(必須) 氏名、品名 NOT NULL 付けない 無いと行の意味が成り立たない。空文字も CHECK で止める
名称(任意) ニックネーム、部署の略称 NULL 可 付けない 「登録していない」を表す。空文字は保存前に NULL へそろえる
金額(確定値) 単価、合計 NOT NULL 付けない 入力漏れを 0 円として保存しないため、既定値を置かない
金額(未確定がありうる) 見積額、値引額 NULL 可 付けない 「まだ決まっていない」と「0 円」を区別する
数量(数えた結果) 在庫数、ポイント、閲覧数 NOT NULL 0 「無い=0個」と言い切れる
数量(回答・測定値) 回答人数、測定値 NULL 可 付けない 未回答を 0 にすると平均が下がる
日付(発生時刻) 登録日時、更新日時 NOT NULL 現在時刻 行ができた時点で必ず決まる
日付(あとで決まる) 完了日時、退会日、発送日 NULL 可 付けない NULL が「まだ起きていない」を表す。遠い未来の日付で代用しない
フラグ 有効、既読、公開 NOT NULL false(安全な側) 真・偽・NULL の3状態にしない
外部キー(必須の親) 注文明細の注文ID NOT NULL 付けない 親が無い行を作らない
外部キー(任意の関連) 担当者ID、上位カテゴリID NULL 可 付けない 「未割り当て」を表す。ID 0 のダミー行を作らない
区分・ステータス 状態、種別 NOT NULL 最初の状態 「未設定」も区分値の1つとして持つ
備考・自由記述 メモ、コメント どちらかに統一 NULL 可なら付けない/NOT NULL なら '' 「無い」の表し方をテーブル全体で1通りにする

表計算ソフトに貼れるタブ区切り版です。

列の種類    例   NULL可否  デフォルト値  理由
名称(必須)  氏名、品名   NOT NULL    付けない    無いと行の意味が成り立たない
名称(任意)  ニックネーム、略称   NULL可   付けない    登録していないことを表す
金額(確定値) 単価、合計   NOT NULL    付けない    入力漏れを0円として保存しない
金額(未確定あり)   見積額、値引額 NULL可   付けない    未確定と0円を区別する
数量(数えた結果)   在庫数、ポイント    NOT NULL    0   無い=0個と言い切れる
数量(回答・測定値)  回答人数、測定値    NULL可   付けない    未回答を0にすると平均が下がる
日付(発生時刻)    登録日時、更新日時   NOT NULL    現在時刻    行ができた時点で決まる
日付(あとで決まる)  完了日時、退会日    NULL可   付けない    まだ起きていないことを表す
フラグ 有効、既読、公開    NOT NULL    false   3状態にしない
外部キー(必須)    明細の注文ID NOT NULL    付けない    親が無い行を作らない
外部キー(任意)    担当者ID   NULL可   付けない    未割り当てを表す
区分・ステータス    状態、種別   NOT NULL    最初の状態   未設定も区分値として持つ
備考・自由記述 メモ、コメント どちらかに統一 NULL可なら無し/NOT NULLなら空文字 無いの表し方を1通りにする

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「NULL許可の設計方針|NOT NULLとデフォルト値の決め方早見表」

NULL・空文字・0の違いと選び方

3つは見た目が似ていても、データベースにとっては別のものです。

項目 NULL 空文字 '' 0
意味 値が無い 長さ0の文字列という値 0 という数値
COUNT(列) 数えない 数える 数える
SUM / AVG 対象から外れる (文字列) 計算に入る
= '' や = 0 での一致 一致しない(IS NULL で調べる) 一致する 一致する
UNIQUE 制約 既定では何行でも入る 1行だけ 1行だけ
NOT IN のリストにあるとき 結果が0件になる 通常どおり 通常どおり

どれを使うかは、次の条件で決めます。

条件 選ぶもの
値がまだ決まっていない、あとで入る NULL
その行にはそもそも当てはまらない NULL(理由まで残したいなら区分列を足す)
数えた結果、1つも無かった 0
利用者が「なし」と答えた 0 または区分値(未回答と分ける)
文字を入力しなかった NULL か空文字のどちらかに統一
集計の平均に含めたくない NULL

集計・一意制約・絞り込みで結果がどう変わるか

次のテーブルで確かめます。備考(memo)は「値あり1行・空文字2行・NULL 2行」、数量(qty)は「10、0、NULL、20、0」です。

CREATE TABLE items (
  id   INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  memo VARCHAR(50),
  qty  INT
);
INSERT INTO items VALUES
  (1,'pen','blue',10),
  (2,'note','',0),
  (3,'tape',NULL,NULL),
  (4,'clip','',20),
  (5,'file',NULL,0);

COUNT・SUM・AVG

SELECT COUNT(*) AS c_all, COUNT(memo) AS c_memo, COUNT(qty) AS c_qty,
       SUM(qty) AS s, AVG(qty) AS a
FROM items;

PostgreSQL 18.4 の結果です。

 c_all | c_memo | c_qty | s  |         a          
-------+--------+-------+----+--------------------
     5 |      3 |     4 | 30 | 7.5000000000000000

MySQL 8.0.46 と SQLite 3.45.1 も同じ値(5、3、4、30、7.5)でした。

  • COUNT(memo) は 3 です。空文字の2行は数え、NULL の2行は数えません。
  • AVG(qty) は 30÷4=7.5 です。0 の2行は分母に入り、NULL の1行は入りません。 NULL の行を 0 で埋めていたら 30÷5=6 になります。

「未回答を 0 で保存する」と平均が下がるのは、この分母の違いによります。

空文字とNULLは別々に数えられる

SELECT COUNT(*) FROM items WHERE memo = '';       -- 2
SELECT COUNT(*) FROM items WHERE memo IS NULL;    -- 2
SELECT COUNT(*) FROM items WHERE memo <> '';      -- 1

3つのデータベースとも 2、2、1 でした。memo <> '' は「空文字ではない行」のつもりでも、NULL の行は条件が不明になるため含まれません。「備考が無い行」を1つの条件で探せるように、NULL か空文字のどちらかに統一しておくと、memo IS NULL OR memo = '' を毎回書かずに済みます。

UNIQUE制約

CREATE TABLE codes (id INT PRIMARY KEY, code VARCHAR(10), UNIQUE (code));
INSERT INTO codes VALUES (1, NULL);
INSERT INTO codes VALUES (2, NULL);
INSERT INTO codes VALUES (3, '');
INSERT INTO codes VALUES (4, '');
データベース NULL の2行目 空文字の2行目
PostgreSQL 18.4 入る ERROR: duplicate key value violates unique constraint "codes_code_key"
MySQL 8.0.46 入る ERROR 1062 (23000): Duplicate entry '' for key 'codes.code'
SQLite 3.45.1 入る UNIQUE constraint failed: codes.code

任意入力で一意にしたい列(社員番号、メールアドレスなど)を空文字で保存すると、2人目が登録できません。 NULL なら何行でも入ります。逆に NULL も1行だけにしたいときは、PostgreSQL では次のように書けます。

CREATE TABLE codes2 (id INT PRIMARY KEY, code VARCHAR(10),
                     UNIQUE NULLS NOT DISTINCT (code));
INSERT INTO codes2 VALUES (1, NULL);
INSERT INTO codes2 VALUES (2, NULL);
ERROR:  duplicate key value violates unique constraint "codes2_code_key"
DETAIL:  Key (code)=(null) already exists.

NOT IN

SELECT COUNT(*) FROM items WHERE id NOT IN (1, 2, NULL);  -- 0
SELECT COUNT(*) FROM items WHERE id NOT IN (1, 2, 0);     -- 3
SELECT COUNT(*) FROM items
WHERE 10 NOT IN (SELECT qty FROM items WHERE id IN (2,3)); -- 0

3つのデータベースとも 0、3、0 でした。リストやサブクエリの結果に NULL が1つ入ると、NOT IN は1行も返しません。サブクエリで参照される列を NOT NULL にしておくと、この結果を設計の段階で避けられます。 NULL を許可する列なら NOT EXISTS で書きます。

並び順

ORDER BY qty, id(昇順)の結果です。

順番 PostgreSQL 18.4 MySQL 8.0.46 SQLite 3.45.1
1 id=2(0) id=3(NULL) id=3(NULL)
2 id=5(0) id=2(0) id=2(0)
3 id=1(10) id=5(0) id=5(0)
4 id=4(20) id=1(10) id=1(10)
5 id=3(NULL) id=4(20) id=4(20)

昇順で NULL が来る位置は、PostgreSQL が最後、MySQL と SQLite が最初でした。降順では逆になります。文字列の memo でも同じで、PostgreSQL は「空文字 → blue → NULL」、MySQL と SQLite は「NULL → 空文字 → blue」の順です。

位置をそろえるには次のように書きます。

-- PostgreSQL(SQLite 3.45.1 でも NULLS FIRST / NULLS LAST が通りました)
SELECT id, qty FROM items ORDER BY qty NULLS FIRST, id;
-- MySQL:NULL を最後にする
SELECT id, qty FROM items ORDER BY qty IS NULL, qty, id;

PostgreSQL の1つ目は「3, 2, 5, 1, 4」、MySQL の2つ目は「2, 5, 1, 4, 3」の順で返りました。

Oracle Databaseでは空文字がNULLになる

Oracle Database の SQL Language Reference(Release 19)の Nulls の項には、「Oracle Database treats a character value with a length of zero as null.」と書かれています。同じ項に、この扱いは将来のリリースで変わる可能性があり、空文字を NULL と同じに扱わないことを勧める、という注意もあります。

つまり Oracle Database では、NOT NULL の文字列列に空文字を入れる設計は成り立ちません。複数のデータベースで動かす可能性があるなら、「文字が無い」は NULL で表す方針にそろえると移しやすくなります。

列の種類別の決め方

名称・文字列:必須なら空文字も止める

NOT NULL だけでは空文字が入ります。必須の名称は CHECK を足します。

CREATE TABLE products (
  id   INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL CHECK (name <> '')
);

任意の文字列は、アプリケーションで保存前に「空文字なら NULL」にそろえるか、SQL 側で NULLIF(入力値, '') を使います。

金額・数量:デフォルト0を付けるかは「0で正しいか」で決める

在庫数やポイントのように「何もしなければ0」が正しい列は NOT NULL DEFAULT 0 が扱いやすく、SUM も素直に書けます。一方、単価のように入力が必須の値に DEFAULT 0 を付けると、入力漏れが 0 として保存され、エラーで気づく機会が無くなります。 必須の値は NOT NULL だけにして、既定値は置きません。

日付:あとで決まる日付はNULLのまま

完了日時を '9999-12-31' のような遠い日付で埋めると、WHERE finished_at IS NULL の代わりに日付の比較が必要になり、期間の計算や最大値の集計にも混ざります。NULL のままにしておけば、「未完了の件数」は COUNT(*) - COUNT(finished_at) で求められます。

フラグ:NOT NULLでデフォルトを安全な側に

真偽値に NULL を許可すると、WHERE is_active = false で NULL の行が抜けます。NOT NULL DEFAULT false とし、「未設定」という第3の状態が必要なら区分列に切り替えます。

外部キー:任意の関連はNULL、ダミーの親行は作らない

担当者が決まっていないタスクは assignee_id を NULL にします。ID 0 の「未割り当て」という行を親テーブルに作ると、担当者数の集計や一覧に毎回の除外条件が必要になります。外部キー制約は NULL の行を検査の対象から外すので、NULL 許可と外部キーは両立します。

区分・ステータス:「未設定」も値として持つ

区分列は NOT NULL にして、最初の状態をデフォルトにします。次の節の「未入力・該当なし・不明」も、この形で表します。

未入力・該当なし・不明を区別する設計

NULL は1種類しかないので、「まだ聞いていない」「聞いたが該当しない」「聞いたが分からない」を NULL だけで区別することはできません。分けたいときは、状態の区分列を NOT NULL で持ち、値の列は「回答あり」のときだけ入るようにします。架空のアンケート(所有している自転車の台数)で書きます。

CREATE TABLE answers (
  id          INT PRIMARY KEY,
  member_name VARCHAR(20) NOT NULL,
  bike_status VARCHAR(10) NOT NULL DEFAULT 'pending'
    CHECK (bike_status IN ('pending','none','unknown','answered')),
  bike_count  INT,
  CHECK ((bike_status = 'answered') = (bike_count IS NOT NULL))
);
INSERT INTO answers (id, member_name) VALUES (1,'sato');
INSERT INTO answers VALUES
  (2,'suzuki','none',NULL),
  (3,'tanaka','unknown',NULL),
  (4,'ito','answered',0),
  (5,'kato','answered',2);
bike_status 意味 bike_count
pending 未入力(まだ聞いていない) NULL
none 該当なし(質問の対象外) NULL
unknown 不明(聞いたが分からない) NULL
answered 回答あり 0 以上の数

2つ目の CHECK は「回答ありのときだけ台数が入る」ことを守ります。組み合わせが合わない行は止まります。

INSERT INTO answers VALUES (6,'ono','none',0);
-- PostgreSQL 18.4
ERROR:  new row for relation "answers" violates check constraint "answers_check"
DETAIL:  Failing row contains (6, ono, none, 0).
-- MySQL 8.0.46
ERROR 3819 (HY000): Check constraint 'answers_chk_2' is violated.
-- SQLite 3.45.1
CHECK constraint failed: (bike_status = 'answered') = (bike_count IS NOT NULL)

集計すると、状態ごとの件数と、回答があった行だけの平均が1回で取れます。

SELECT bike_status, COUNT(*) AS n, AVG(bike_count) AS avg_cnt
FROM answers GROUP BY bike_status ORDER BY bike_status;
 bike_status | n |        avg_cnt         
-------------+---+------------------------
 answered    | 2 | 1.00000000000000000000
 none        | 1 |                       
 pending     | 1 |                       
 unknown     | 1 |                       

「0台と答えた人」は answered の 0 として平均に入り、未入力・該当なし・不明は入りません。区別が要らない列にまでこの形を使う必要はなく、理由を集計や画面で使う列だけに絞ります。

既存テーブルへNOT NULL列を後から足す手順

行が入っているテーブルに NOT NULL 列を足すときは、データベースごとに動きが違います。3行入った members テーブルで試しました。

CREATE TABLE members (id INT PRIMARY KEY, name VARCHAR(20) NOT NULL);
INSERT INTO members VALUES (1,'sato'),(2,'suzuki'),(3,'tanaka');

ALTER TABLE members ADD COLUMN rank_code VARCHAR(10) NOT NULL;
データベース デフォルト無しで NOT NULL 列を追加した結果
PostgreSQL 18.4 ERROR: column "rank_code" of relation "members" contains null values
MySQL 8.0.46 エラーにならず、既存の3行に空文字が入る
SQLite 3.45.1 Cannot add a NOT NULL column with default value NULL

MySQL では厳密モードのままでも列が追加され、既存行は空文字になりました。

+----+--------+-----------+
| id | name   | rank_code |
+----+--------+-----------+
|  1 | sato   |           |
|  2 | suzuki |           |
|  3 | tanaka |           |
+----+--------+-----------+

MySQL 8.4 のリファレンス(Data Type Default Values)には、型ごとの暗黙のデフォルト値として「数値は 0、文字列は空文字、日付と時刻はその型のゼロ値」と書かれています。意図しない空文字や 0 を既存行に入れないために、どのデータベースでも次の3段階で進めるのが確実です。

手順1:デフォルトで埋めてよい列は、DEFAULT付きで1回で足す

ALTER TABLE members ADD COLUMN points INT NOT NULL DEFAULT 0;

3つのデータベースとも成功し、既存の3行は 0 になりました。PostgreSQL の ALTER TABLE のドキュメントには、変化しない値の DEFAULT を付けた ADD COLUMN は値をテーブルのメタデータに保存するので、大きなテーブルでも速く終わると書かれています。

手順2:行ごとに値が違う列は「NULL可で追加 → 値を埋める → NOT NULLにする」

-- 1. NULL 可で追加
ALTER TABLE members ADD COLUMN joined_on DATE;
-- 2. 既存行に値を入れる(分かる範囲から)
UPDATE members SET joined_on = '2026-04-01' WHERE id IN (1,2);
-- 3. NOT NULL にする(PostgreSQL)
ALTER TABLE members ALTER COLUMN joined_on SET NOT NULL;

NULL の行が残ったまま3を実行すると止まります。

-- PostgreSQL 18.4
ERROR:  column "joined_on" of relation "members" contains null values
-- MySQL 8.0.46(ALTER TABLE members MODIFY joined_on DATE NOT NULL;)
ERROR 1138 (22004): Invalid use of NULL value

残りの行を埋めてから、もう一度実行すると通ります。

UPDATE members SET joined_on = '2026-10-01' WHERE joined_on IS NULL;
ALTER TABLE members ALTER COLUMN joined_on SET NOT NULL;   -- PostgreSQL
ALTER TABLE members MODIFY joined_on DATE NOT NULL;        -- MySQL

SQLite は列の制約を後から変える ALTER TABLE を持たないので、手順1の形(DEFAULT 付きで追加)にするか、新しいテーブルを作って行を移します。

手順3:大きなテーブルではNOT VALIDで分ける(PostgreSQL 18)

PostgreSQL 18 では、NOT NULL 制約を NOT VALID で追加し、あとから検証できます。

ALTER TABLE members ADD COLUMN email VARCHAR(100);
ALTER TABLE members ADD CONSTRAINT members_email_nn NOT NULL email NOT VALID;

この時点で既存行は NULL のままですが、新しい行は検査されます。

INSERT INTO members (id,name,joined_on) VALUES (5,'ito','2026-10-06');
ERROR:  null value in column "email" of relation "members" violates not-null constraint
DETAIL:  Failing row contains (5, ito, 0, 2026-10-06, null).

既存行を埋めてから検証します。

UPDATE members SET email = 'user' || id || '@example.com' WHERE email IS NULL;
ALTER TABLE members VALIDATE CONSTRAINT members_email_nn;

PostgreSQL のドキュメントによると、NOT VALID を付けた ADD CONSTRAINT はテーブルを走査せずにすぐ終わり、VALIDATE CONSTRAINT は SHARE UPDATE EXCLUSIVE ロックだけで検証します。追加と検証を分けることで、ほかの更新を待たせる時間を短くできます。

INSERTで列を省略したときの動き

NOT NULL でデフォルト値が無い列を INSERT で省略すると、次のようになります。

INSERT INTO members (id) VALUES (4);
-- PostgreSQL 18.4
ERROR:  null value in column "name" of relation "members" violates not-null constraint
-- MySQL 8.0.46(厳密モード)
ERROR 1364 (HY000): Field 'name' doesn't have a default value
-- SQLite 3.45.1
NOT NULL constraint failed: members.name

MySQL で SET SESSION sql_mode = ''; として厳密モードを外すと、同じ INSERT が警告つきで通り、暗黙のデフォルト値が入りました。

+----+--------+-----------+--------+------------+
| id | name   | rank_code | points | joined_on  |
+----+--------+-----------+--------+------------+
|  4 |        |           |      0 | 0000-00-00 |
+----+--------+-----------+--------+------------+

NOT NULL を付けていても、厳密モードが外れていると空文字や 0000-00-00 が入ります。 MySQL では sql_mode に STRICT_TRANS_TABLES が入っていることを設計書に書いておくと安心です。

確かめて分かったこと

  • MySQL は、行があるテーブルへ DEFAULT 無しの NOT NULL 列を足してもエラーにならず、厳密モードでも既存行に空文字が入りました。 PostgreSQL と SQLite は止まります。
  • 昇順での NULL の位置は PostgreSQL が最後、MySQL と SQLite が最初で、同じ SQL でも一覧の先頭が変わります。
  • UNIQUE 制約は3つのデータベースとも NULL を何行でも受け入れ、空文字は1行だけでした。
  • memo <> '' は NULL の行を返しません。「空でない行」のつもりで書いても、NULL の行は対象から外れます。
  • PostgreSQL 18 の NOT NULL … NOT VALID は、追加した直後から新しい行の NULL を止め、既存行の検査だけを後回しにできました。
  • CHECK で「状態が回答ありのときだけ値が入る」を書くと、3つのデータベースとも組み合わせの合わない行を止めました。

設計レビュー用チェックリスト

確認すること 見るところ
NULL 可の列すべてに理由が書いてあるか テーブル定義書の備考欄
必須の文字列に空文字を止める CHECK があるか 名称、コード
DEFAULT 0 や DEFAULT '' が「入力漏れ」を隠していないか 金額、必須のコード
ダミー値(0、-1、'9999-12-31'、'未設定')で NULL を代用していないか 日付、外部キー
フラグが NOT NULL でデフォルトを持つか 真偽値の列
「無い」の表し方(NULL か空文字か)が統一されているか 備考、任意の文字列
NOT IN のサブクエリで使う列が NOT NULL か 外部キー、コード
一覧の並び順で NULL の位置を指定しているか ORDER BY のある画面・帳票

よくある質問

Q. NULL と空文字の違いは? A. NULL は値が無いことを表す印、空文字は長さ0の文字列という値です。COUNT(列) は空文字を数えて NULL を数えず、UNIQUE 制約は空文字を1行だけ、NULL を何行でも受け入れます。Oracle Database では空文字が NULL として扱われます。

Q. NOT NULL にデフォルト値は必ず付けるべき? A. 付けるのは「入力しなかったときにその値で正しい」列だけです。数量の 0、フラグの false、登録日時の現在時刻が代表で、必須入力の名称や単価には付けません。付けると入力漏れがエラーにならず保存されます。

Q. 数値の列は NULL と 0 のどちらにする? A. 「数えた結果が無い」なら 0、「まだ分からない・答えていない」なら NULL です。AVG は 0 を分母に入れ、NULL を入れないので、未回答を 0 で保存すると平均が下がります。

Q. 既存テーブルに NOT NULL 列を追加できないときは? A. 「NULL 可で追加 → 既存行を UPDATE で埋める → NOT NULL に変更」の順で進めます。全行が同じ値でよいなら ADD COLUMN … NOT NULL DEFAULT 値 の1回で済みます。

まとめ

  • 原則 NOT NULL。NULL を許可するのは「まだ無い」「該当しない」に意味がある列だけにします。
  • 0・空文字・遠い日付のダミー値で NULL を代用しない。 集計や一意制約に「値」として効きます。
  • デフォルト値は「その値で正しい」と言える列だけ(数量 0、フラグ false、登録日時)。
  • 「無い」の表し方は NULL か空文字のどちらかに統一し、必須の文字列は CHECK で空文字も止めます。
  • 未入力・該当なし・不明を分けたいときは区分列を足し、CHECK で値の列との組み合わせを守ります。
  • NOT NULL 列を後から足すときは「追加 → 埋める → 制約」の3段階。PostgreSQL 18 は NOT VALID で検証を分けられます。
  • NULL の並び順と、MySQL の暗黙のデフォルト値はデータベースごとに違うので、設計書に書いておきます。

参考・出典

  • PostgreSQL 18 Documentation「ALTER TABLE」 https://www.postgresql.org/docs/18/sql-altertable.html
  • MySQL 8.4 Reference Manual「Data Type Default Values」 https://dev.mysql.com/doc/refman/8.4/en/data-type-defaults.html
  • Oracle Database SQL Language Reference, Release 19「Nulls」 https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Nulls.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「NULL許可の設計方針|NOT NULLとデフォルト値の決め方早見表」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?