将相关记录复制到新表

时间:2019-03-13 00:22:54

标签: sql postgresql

我有四个表-company_targetablesemployee_targetablesemployeesusers。我正在使用Postgresql 9.6。

模式:

company_targetables

  • id
  • company_id外键
  • name字符串
  • value-字符串

employee_targetables

  • id
  • company_targetable_id外键
  • employee_id外键

employees   -user_id

employee_targetablescompany_targetablesemployees之间的联接。

我想将company_targetablesemployee_targetables分别移到新表custom_attributesuser_custom_attributes上,以保留关系,但不希望将user_custom_attributes与员工,我想将其与带有user外键的user_id记录关联。

新表的架构:

custom_attributes

  • company_targetables的架构相同

user_custom_attributes

  • custom_attribute_id
  • user_id需要从旧表的关联employee记录中获取用户ID

例如,如果我有一个employee_targetable与ID为1的company_targetable关联,则可以轻松地复制company_targetable_id,但是我需要确保相应的{{1}使用与custom_attribute相同的值创建}记录,以便保留关系中的列值。另外,我想确保新的company_targetable记录在user_custom_attribute列中填充user_id值。

当前,我正在按1进行此操作-首先创建employees.user_id记录,然后从custom_attribute抓取user_id并创建employee记录,但是大约500,000条记录,这需要一段时间。

有没有一种有效的方法?

1 个答案:

答案 0 :(得分:0)

这就是我的想法

首先复制从company_targetables到custom_attributes的所有内容:

      INSERT INTO custom_attributes(id, name, value, targetable, company_id, created_at, updated_at)
  SELECT company_targetables.id, company_targetables.name, company_targetables.value, 't',
         company_targetables.company_id, company_targetables.created_at, company_targetables.updated_at
  FROM company_targetables

然后从employee_targetables到user_custom_attributes的所有内容,加入员工,因此我可以填写user_id列:

      INSERT INTO user_custom_attributes(id, custom_attribute_id, user_id, created_at, updated_at)
  SELECT employee_targetables.id, employee_targetables.company_targetable_id, employees.user_id,
         employee_targetables.created_at, employee_targetables.updated_at
  FROM employee_targetables
  INNER JOIN employees ON employees.id = employee_targetables.employee_id

花费大约22秒钟的时间记录约500,000条记录-也许也有一种批处理更新的好方法。