我尝试运行以下脚本:
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 的解决方案
尝试以下操作,所以我认为您应该做的是确保
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;