需要知道我是否可以在PostgreSQL中向表中添加不区分大小写的外键约束。我正在将数据库从MySQL转换为PostgreSQL。外键已经在MySQL中创建,我没有遇到任何问题,因为MySQL不区分大小写。当我将所有数据从MySQL加载到PostgreSQL然后尝试将外键添加到表中时,我在Postgres中收到错误。例如:
表A有2列: ID(int)和Name(varchar(25))
Entry1: ID = 1 , Name = 'America'
Entry2: ID = 2 , Name = 'Canada'
表B有2列: ID(int)和Name(varchar(25))
Entry1: ID(int) = 10 , Name(Varchar(25)) = 'AmeRiCA'
Entry1: ID = 1 , Name = 'Canada'
在MySQL中,外键是在表A和表B的列#34;名称"之间创建的,但在Postgres中,由于区分大小写,我收到错误。
我没有选择更改表格并将Varchar更改为citext。无论如何我可以在PG中定义一个不区分大小写的外键。
有什么建议吗?
由于
答案 0 :(得分:1)
到目前为止,您可以做的最好的事情是更正您的数据。例如:
update A set name=initcap(name) where name<>initcap(name);
update B set name=initcap(name) where name<>initcap(name);
如果这是不可接受的,那么你可以在两个表中创建额外的列,比如说name_lower
,它会使用触发器自动设置为lower(name)
:
create or replace function name_lower_trigger() returns trigger as $$
begin
NEW.name_lower=lower(name);
return NEW;
end;
$$ language plpgsql;
create trigger a_name_lower_trigger
before insert or update on a
for each row execute procedure name_lower_trigger();
create trigger b_name_lower_trigger
before insert or update on b
for each row execute procedure name_lower_trigger();
使用这些列创建外键约束。但它会使数据库非规范化并浪费存储并且很难看。更正数据要好得多。