一、唯一约束基本概念
唯一约束(UNIQUE Constraint)是KES数据库中确保表中列或列组合的值唯一的一种约束机制。当试图插入或更新数据违反这一约束时,数据库会抛出"重复键违反唯一约束"的错误。
唯一约束主要特点:
- 确保列或列组合的值在表中唯一
- 允许NULL值(NULL不等于NULL,因此可存在多个NULL)
- 自动创建唯一索引来支持约束检查
二、错误表现形式
当违反唯一约束时,KES会抛出如下错误:
ERROR: duplicate key value violates unique constraint "约束名"
DETAIL: Key (列名)=(重复值) already exists.
三、创建唯一约束的方法
1. 建表时创建
-- 单列唯一约束
test=# CREATE TABLE products (
test(# product_id INTEGER PRIMARY KEY,
test(# product_code VARCHAR(20) UNIQUE,
test(# product_name VARCHAR(100)
test(# );
CREATE TABLE-- 多列组合唯一约束
test=# CREATE TABLE orders (
test(# order_id INTEGER PRIMARY KEY,
test(# customer_id INTEGER,
test(# order_date DATE,
test(# UNIQUE (customer_id, order_date)
test(# );
CREATE TABLE
2. 表已存在后添加
-- 添加单列唯一约束
test=# ALTER TABLE products ADD CONSTRAINT uk_product_code UNIQUE (product_code);
ALTER TABLE-- 添加多列组合唯一约束
test=# ALTER TABLE orders ADD CONSTRAINT uk_customer_order UNIQUE (customer_id, order_date);
ALTER TABLE
四、违反约束的典型场景
1. 插入重复值
test=# INSERT INTO products VALUES (1, 'P001', '笔记本电脑');
INSERT 0 1
test=# INSERT INTO products VALUES (2, 'P001', '智能手机'); -- 报错
ERROR: 重复键违反唯一约束"products_product_code_key"
描述: 键值"(product_code)=(P001)" 已经存在
2. 更新为重复值
UPDATE products SET product_code = 'P001' WHERE product_id = 2; -- 报错
3. 批量操作中的部分重复
test=# INSERT INTO products VALUES
test-# (3, 'P003', '键盘'),
test-# (4, 'P004', '鼠标'),
test-# (5, 'P003', '显示器'); -- 报错,整个语句回滚
ERROR: 重复键违反唯一约束"products_product_code_key"
描述: 键值"(product_code)=(P003)" 已经存在
五、处理违反约束的解决方案
1. 忽略重复行(使用ON CONFLICT子句)
-- 冲突时不执行操作
test=# INSERT INTO products VALUES (2, 'P001', '智能手机')
test-# ON CONFLICT (product_code) DO NOTHING;
INSERT 0 0-- 冲突时更新其他列
test=# INSERT INTO products VALUES (2, 'P001', '智能手机')
test-# ON CONFLICT (product_code)
test-# DO UPDATE SET product_name = EXCLUDED.product_name;
INSERT 0 1