DEFAULT 預設值約束

DEFAULT 約束用來設定欄位的預設值。當新增資料時,如果沒有指定該欄位的值,就會使用預設值。

建立資料表時設定

CREATE TABLE orders (
    id INT PRIMARY KEY,
    product_name VARCHAR(100),
    quantity INT DEFAULT 1,
    status VARCHAR(20) DEFAULT 'pending',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

新增資料時的效果

-- 只指定部分欄位
INSERT INTO orders (id, product_name) VALUES (1, '商品A');

-- 結果:quantity = 1, status = 'pending', created_at = 當前時間

常用的預設值

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    is_active BOOLEAN DEFAULT TRUE,           -- 布林值
    balance DECIMAL(10,2) DEFAULT 0.00,       -- 數值
    country VARCHAR(50) DEFAULT 'Taiwan',     -- 字串
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,  -- 當前時間
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  -- MySQL: 自動更新時間
);

新增 DEFAULT 約束

-- MySQL / PostgreSQL
ALTER TABLE orders ALTER COLUMN status SET DEFAULT 'pending';

-- SQL Server
ALTER TABLE orders ADD DEFAULT 'pending' FOR status;

移除 DEFAULT 約束

-- MySQL
ALTER TABLE orders ALTER COLUMN status DROP DEFAULT;

-- PostgreSQL
ALTER TABLE orders ALTER COLUMN status DROP DEFAULT;

-- SQL Server (需先知道約束名稱)
ALTER TABLE orders DROP CONSTRAINT DF_orders_status;

DEFAULT 與 NULL 的差異

DEFAULT 只在沒有指定值時生效。如果明確指定 NULL,欄位會是 NULL 而非預設值:

-- 使用預設值
INSERT INTO orders (id, product_name) VALUES (1, '商品A');
-- status = 'pending'

-- 明確指定 NULL
INSERT INTO orders (id, product_name, status) VALUES (2, '商品B', NULL);
-- status = NULL (如果欄位允許 NULL)