不区分大小写的外键PostgreSQL

时间:2014-10-15 17:43:34

标签: sql postgresql case-sensitive postgresql-9.3

需要知道我是否可以在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中定义一个不区分大小写的外键。

有什么建议吗?

由于

1 个答案:

答案 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();

使用这些列创建外键约束。但它会使数据库非规范化并浪费存储并且很难看。更正数据要好得多。