H2 數據庫中的批量操作與數據校驗關鍵字
在 H2 數據庫的高效使用場景中,批量操作關鍵字能大幅提升數據處理速度,數據校驗關鍵字則為數據準確性保駕護航。這兩類關鍵字適配了批量導入、批量更新等高頻場景,同時避免無效數據流入數據庫,讓數據操作既高效又可靠。
一、批量操作關鍵字
批量操作關鍵字能減少數據庫交互次數,降低開銷,尤其適合大數據量處理場景,INSERT ... SELECT、UPDATE ... FROM是核心代表。
INSERT ... SELECT可直接將查詢結果批量插入目標表,無需逐條構造插入語句。比如將臨時表中的數據批量遷移到正式訂單表:
-- 創建臨時表並插入測試數據
CREATE TEMPORARY TABLE temp_batch_orders (
user_id INT,
order_no VARCHAR(30),
pay_amount DECIMAL(10,2)
);
INSERT INTO temp_batch_orders (user_id, order_no, pay_amount)
VALUES (1, 'ORD20240501', 199.99), (2, 'ORD20240502', 299.99), (3, 'ORD20240503', 399.99);
-- 批量插入到正式訂單表,自動填充訂單時間
INSERT INTO orders (user_id, order_no, pay_amount, order_time)
SELECT user_id, order_no, pay_amount, CURRENT_TIMESTAMP
FROM temp_batch_orders;
這種方式比循環執行單條INSERT語句快數倍,尤其在數據量達數千條以上時,效率差異更明顯。
UPDATE ... FROM支持通過關聯其他表的數據批量更新目標表字段,比如根據商品分類表的折扣率,批量更新商品表的折後價:
-- 創建商品分類表並插入數據
CREATE TABLE product_categories (
category_id INT PRIMARY KEY,
category_name VARCHAR(50),
discount_rate DECIMAL(3,2)
);
INSERT INTO product_categories (category_id, category_name, discount_rate)
VALUES (1, '電子產品', 0.85), (2, '生活用品', 0.9);
-- 批量更新商品表折後價(關聯分類表獲取折扣率)
UPDATE products p
SET p.discount_price = p.original_price * c.discount_rate
FROM product_categories c
WHERE p.category_id = c.category_id;
無需手動匹配分類與商品,一條語句就能完成批量更新,大幅減少操作步驟。
二、數據校驗關鍵字
數據校驗關鍵字能在數據寫入或更新時進行規則校驗,拒絕不符合要求的數據,CHECK、UNIQUE、NOT NULL的進階用法的和CONSTRAINT約束命名關鍵字是重點。
CHECK約束除了單字段校驗,還支持多字段聯合校驗,比如限制訂單的支付金額不能大於商品原價總和,且支付時間不能早於下單時間:
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_time TIMESTAMP NOT NULL,
pay_time TIMESTAMP,
original_total DECIMAL(10,2) NOT NULL,
pay_amount DECIMAL(10,2) NOT NULL,
-- 多字段聯合CHECK約束
CONSTRAINT chk_order_amount_time CHECK (
pay_amount <= original_total
AND (pay_time IS NULL OR pay_time >= order_time)
)
);
當插入pay_amount > original_total或pay_time < order_time的記錄時,數據庫會直接拋出錯誤,阻止無效數據寫入。
CONSTRAINT關鍵字可給約束命名,讓約束管理更清晰,後續修改或刪除約束時更精準。比如給用户表的手機號添加命名唯一約束:
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
phone VARCHAR(20),
-- 命名唯一約束
CONSTRAINT uk_users_phone UNIQUE (phone)
);
後續需要刪除該約束時,直接使用約束名即可,無需模糊查找:
ALTER TABLE users DROP CONSTRAINT uk_users_phone;
NOT NULL結合DEFAULT能實現字段非空且有默認值的雙重保障,比如商品表的庫存字段,默認值為 0 且不能為 NULL:
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
stock INT NOT NULL DEFAULT 0,
-- 校驗庫存不能為負數
CONSTRAINT chk_product_stock CHECK (stock >= 0)
);
即使插入數據時未指定stock字段,也會自動填充為 0,同時CHECK約束確保庫存不會被更新為負數。
這些批量操作與數據校驗關鍵字,前者聚焦效率提升,後者側重數據質量保障。在實際開發中,批量操作關鍵字能應對大數據量遷移、批量更新等場景,數據校驗關鍵字則從源頭阻止無效數據,兩者結合讓 H2 數據庫的操作既高效又安全,更好地支撐業務場景的需求。