我需要使用另一个表中的某些数据创建一个新表,但是使用新表中新插入记录的ID更新原始表。像这样:
NEW_TABLE
----------------
id
-- other data --
ORIGINAL_TABLE
----------------
id
new_table_id
-- other data --
但是,添加到new_table的记录将被分组以消除重复。因此,它不会是一对一的插入。查询需要更新匹配的记录,而不仅仅是复制的记录。
我可以在一个查询中执行此操作吗?我曾尝试在original_table上单独更新,但它无效。
有什么建议吗?
答案 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']));
}
以上是您工作流程的全局示例。