KES数据库重复键违反唯一约束

一、唯一约束基本概念

唯一约束(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

image

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

image

四、违反约束的典型场景

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)" 已经存在

image

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)" 已经存在

image

五、处理违反约束的解决方案

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

image

posted @ 2025-09-05 17:39  能豆豆!  阅读(20)  评论(0)    收藏  举报