1

我正在通过INSERT INTO table1 SELECT * FROM table2查询将数据从一个表移动到另一个表。正在移动的数据包含有关员工的信息(名字、姓氏……等)以及该员工简历的路径。我现在试图将该信息拆分为两个不同的表,一个用于员工信息的表,一个用于文档(简历)信息的表,通过将员工 ID 放入文档表中来链接两者。员工 ID 和文档 ID 都将是自动递增的 PK 值。

我知道我可以将这些查询放入 for 循环并一次移动一行,last insert id在将文档信息添加到文档表之前抓取员工表的 ,以便将两者链接起来。我很好奇是否有一种方法可以在一个查询中执行此操作,能够从原始表中获取多行,将要插入的信息拆分到两个新/不同的表中,并在员工中使用自动生成的 ID表作为文档表中的值....希望这是有道理的!

4

1 回答 1

2

抱歉,如果我弄错了,但您想用您当前的数据库表执行一次此查询吗?而且我猜这两个表的行数相同(并且按彼此的顺序)?

如果你把它们分开,你会得到:

以员工表为例:

 - employee_id(auto_increment)
 - employee_firstname
 - employee_lastname
 - employee_document_id
 - +whatever you want etc

文档表例如:

 - document_id(auto_increment)
 - document_name
 - document_path
 - document_employee_id
 - +whatever you want etc.

如果这就是您的意思,那么我认为以下方法会起作用:

1:设置 PDO(编辑器对我不起作用,这就是为什么“>”)

    <?php

    $config['db'] = array(
        'host' => 'host',
        'username' => 'username',
        'password' => 'password',
        'dbname' => 'dbname'
    );

    $db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['dbname'], $config['db']['username'], $config['db']['password']);

    ?>

2:设置插入查询


<?php
$select_query = "SELECT * FROM table1"; 
//$db is PDO example name
$select_all = $db->prepare($select_query);
$select_all->execute();
$count = $select_all->rowCount();
for(var i = 0; i =< $count; ++i) { 
    $insert_query1 = "INSERT INTO table1 (employee_firstname,
    employee_lastname, employee_document_id)
    VALUES(employee_firstnameValue, employee_lastnameValue,'"i"'";

    $insert_query2 = "INSERT INTO table2 (document_name, document_path,
    employee_id) VALUES(document_nameValue, document_pathValue, '"i"')"

    $insert_table1 = $db->prepare($insert_query1);
    $insert_table1->execute()

    $insert_table2 = $db->prepare($insert_query2);
    $insert_table2->execute()
}
?>

我认为上面的方法会起作用,因为你会得到一个从 1 开始的 auto_increment,en de ++i 每次都会发生。因此,employee_document_id 和 document_employee_id 都将获得 ++i(即 1),就像 auto_increment 是(也是 1)一样

但也许这是想太多了..或者不会在你的模型中工作

旁注:

  • 建议在查询中使用参数。
  • 这只是我想到的一个松散的描述方法(也许你可以从这里拿起一些东西..)

编辑:另一个解决方案是使用像“SELECT MAX”这样的查询,但这是不安全的。

于 2013-09-10T13:10:33.590 回答