错误:某些行违反了关系“my_table”的检查约束“to_uppercase”

问题描述 投票:0回答:1

我尝试运行以下脚本:

ALTER TABLE my_table
    ADD CONSTRAINT to_uppercase CHECK (upper(my_name) = my_name);

但是当我这样做时,我收到错误:

 ERROR: check constraint "to_uppercase" of relation "my_table" is violated by some row

这个错误是预料之中的,因为在某些行上我有包含小写符号的值。

有没有办法定义

on conflict
来替换同一语句中的值以大写?

附注我知道我可以使用

搜索行
select ...
where my_name !=  upper(my_name )

并进行后续更新,但我想找到使用单个 stetement 的解决方案

postgresql constraints uppercase
1个回答
0
投票

尝试以下操作,所以我认为您应该做的是确保

my_name
my_table
列中的所有数据在应用新约束之前满足大写的要求,我提出了一个包含在单个事务的原子性。首先,执行
UPDATE
语句,在必要时将
my_name
中的所有现有条目转换为大写,确保当前数据不会违反新约束。接下来,使用
ALTER TABLE
语句添加
CHECK
约束,强制
my_name
中的所有新行或更新行均为大写。这种方法封装在
BEGIN
COMMIT
事务中,保证数据库保持一致性,并且所有条目在强制执行之前都遵守约束要求。

BEGIN;

-- Update existing rows to have uppercase 'my_name'
UPDATE my_table
SET my_name = upper(my_name)
WHERE my_name != upper(my_name);

-- Now add the constraint, since all values should conform
ALTER TABLE my_table
ADD CONSTRAINT to_uppercase CHECK (upper(my_name) = my_name);

COMMIT;
© www.soinside.com 2019 - 2024. All rights reserved.