规范化逗号分隔的外键

时间:2014-03-26 08:49:37

标签: sql database postgresql

我有"元素"和#34;作者"表,其中元素表可以有一个或多个作者,但表没有规范化(一些人很久以前设计过)。例如:

element_id   ...     ...  authors
369561                    319,30,2496,544

数据库足够大,所以我需要一些 SQL脚本来创建和填充连接表,例如: " element_authors"

element_id | author_id
369561       319
369561       30
369561       2496
369561       544

我不知道如何编写此脚本,有什么帮助?

1 个答案:

答案 0 :(得分:2)

一般的想法是使用regexp_split_to_table将逗号分隔字段拆分为一个集合,将每个值转换为integer,并将结果与​​我们得到的元组中的element_id配对原始的逗号分隔字段来自。

对于PostgreSQL 9.3,你要写:

INSERT INTO element_authors(element_id, author_id)
SELECT
  element_id,
  CAST (author_id AS integer) AS author_id
FROM
  element,
  LATERAL regexp_split_to_table(nullif(authors, ''), ',') author_id;

或在较旧的PostgreSQL版本上我认为在这种情况下可以安全地编写:

INSERT INTO element_authors(element_id, author_id)
SELECT
  element_id,
  CAST( regexp_split_to_table(nullif(authors, ''), ',') AS integer) AS author_id
FROM
  element;