我有四个表-company_targetables
,employee_targetables
,employees
和users
。我正在使用Postgresql 9.6。
模式:
company_targetables
id
company_id
外键name
字符串value
-字符串 employee_targetables
id
company_targetable_id
外键employee_id
外键 employees
-user_id
employee_targetables
是company_targetables
和employees
之间的联接。
我想将company_targetables
和employee_targetables
分别移到新表custom_attributes
和user_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条记录,这需要一段时间。
有没有一种有效的方法?
答案 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条记录-也许也有一种批处理更新的好方法。