我在 MySQL 中有一个多对多连接,将角色链接到任务(三个表:角色、任务和角色_任务)。每个角色和任务都属于一个项目。
Roles Table
id | project_id | role
---|------------|-------------
1 | 1 | Supervisor
2 | 1 | Manager
Tasks Table
id | project_id | task
---|------------|-------------
1 | 1 | Do this
2 | 1 | Do that
role_task Table
role_id | task_id
-----------------
1 | 1
1 | 2
2 | 1
我正在寻找一种纯 SQL 方法来将角色、任务及其关联的多对多连接从一个项目复制到另一个项目。我想完成的是:
Roles Table
id | project_id | role
---|------------|-------------
1 | 1 | Supervisor
2 | 1 | Manager
3 | 2 | Supervisor
4 | 2 | Manager
Tasks Table
id | project_id | task
---|------------|-------------
1 | 1 | Do this
2 | 1 | Do that
3 | 2 | Do this
4 | 2 | Do that
role_task Table
role_id | task_id
--------|--------
1 | 1
1 | 2
2 | 1
3 | 3
3 | 4
4 | 3
我可以毫无问题地复制/复制角色表和任务表中的数据。但是,如何使用新的角色 ID 和任务 ID 复制 role_task 表?我可以在 PHP 中使用循环并获取插入的 id,但更喜欢纯 SQL 解决方案。谢谢
最佳答案
我能够做到这一点的唯一明智的方法是向保存原始记录 ID 的角色和任务表添加一个字段。 role_task 表保持不变,但我的其他两个表现在看起来像这样:
roles table
id | project_id | original_id | role
---|------------|-------------|-----
1 | 1 | 0 | Supervisor
2 | 1 | 0 | Manager
tasks table
id | project_id | original_id | task
---|------------|-------------|-----
1 | 1 | 0 | Do this
2 | 1 | 0 | Do that
因此,将角色和任务复制到 project_id 为 3 的 SQL 是:
INSERT roles
SELECT NULL, 3, id, role FROM Roles WHERE project_id = 1
INSERT tasks
SELECT NULL, 3, id, task FROM Tasks WHERE project_id = 1
然后,复制多对多表:
INSERT role_task
SELECT r.id, t.id
FROM role_task AS rt
LEFT JOIN roles AS r ON rt.role_id = r.original_id
LEFT JOIN tasks AS t ON rt.task_id = t.original_id
WHERE r.project_id = 3
AND t.project_id = 3
关于php - MySQL在多对多连接中复制记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38101630/