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)