将记录移动到新表中,相应地更新原始id

时间:2015-07-22 13:46:50

标签: php mysql

我需要使用另一个表中的某些数据创建一个新表,但是使用新表中新插入记录的ID更新原始表。像这样:

NEW_TABLE
----------------
id
-- other data --


ORIGINAL_TABLE
----------------
id
new_table_id
-- other data --

但是,添加到new_table的记录将被分组以消除重复。因此,它不会是一对一的插入。查询需要更新匹配的记录,而不仅仅是复制的记录。

我可以在一个查询中执行此操作吗?我曾尝试在original_table上单独更新,但它无效。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以使用temporary tables或为NEW_TABLE创建view

临时表

  

创建表时可以使用TEMPORARY关键字。 TEMPORARY表仅对当前会话可见,并在会话关闭时自动删除。这意味着两个不同的会话可以使用相同的临时表名,而不会相互冲突或与现有的同名非TEMPORARY表冲突。 (在删除临时表之前,将隐藏现有表。)要创建临时表,您必须具有CREATE TEMPORARY TABLES特权。

--Temporary Table
create temporary table NEW_TABLE as (select * from ORIGINAL_TABLE group by id);

浏览

  

MySQL Server 5.0中提供了视图(包括可更新视图)。视图是存储的查询,在调用时会生成结果集。视图充当虚拟表。 5.0.1及更高版本的二进制版本中提供了视图。

--View
create view NEW_TABLE as select * from ORIGINAL_TABLE group by id;

视图将始终使用ORIGINAL_TABLE中的值进行更新,您不必担心数据库中存在重复信息。

如果您不想使用该视图,我相信您一次只能在一个表上执行插入,除非您有某种允许您同时执行这两种操作的视图,但您可能希望这样做交易中的两个步骤

首先,您必须告诉数据库您想要start a transaction。然后,您将执行操作并检查它们是否成功。您可以在第二个语句中使用id of last inserted row(假设您有一个auto_increment字段)。如果两个声明似乎都正常,您可以commit进行更改,如果没有,rollback更改。

示例:

//Assume it will be okay
$success = true;

//Start the transaction (assuming you have a database handle)
$dbh->beginTransaction();

//First Query
$stmt = "Insert into ....";
$sth = $dbh->prepare($stmt);
//See if it works
if (!$sth->execute())
    $success = false;

$last_id = $dbh->lastInsertId();

//Second Query
$stmt = "Insert into .... (:ID ....)";
$sth = $dbh->prepare($stmt);
$sth->bindValue(":ID", $last_id);
//See if it works
if (!$sth->execute())
    $success = false;

//If all is good, commit, otherwise, rollback
if ($success)
    $dbh->commit();
else
    $dbh->rollBack();

答案 1 :(得分:0)

我将会看到3个单独的查询。

$db = new PDO("...");
$stmt = $db->prepare("SELECT * FROM table");
$stmt->execute();
$results = $stmt->fetchAll();just iterate o

foreach ($results as $result) {
    $stmt = "INSERT INTO new_table (...) VALUES (...)";
    $stmt = $pdo->prepare($stmt);
    $data = $stmt->execute();

    $insert_id = $pdo->lastInsertId();

    // Update first table
    $stmt = "UPDATE table SET id=:last WHERE id=:id";
    $stmt = $pdo->prepare($stmt);
    $data = $stmt->execute(array('last' => $insert_id, 'id' => $result['id']));
}

以上是您工作流程的全局示例。