删除多个数据库中的行

时间:2009-06-30 10:17:01

标签: php mysql

我正在使用PHP和MySQL。我需要进行查询:

DELETE FROM db1.players WHERE acc NOT IN (SELECT id FROM db2.accounts)

问题是,db1和db2位于不同的服务器上。这种问题的最快解决方案是什么?

准确地说:我正在使用2个连接,所以我认为我不能使用一个查询。

5 个答案:

答案 0 :(得分:5)

您必须将所需的列表保存到数组中并将其与其他数据库进行比较

您可以创建federated table并使其看起来像是在1个数据库上运行查询。

答案 1 :(得分:1)

我不知道它是否是最快的,但我会在包含帐户ID的db2上创建一个临时表,将该表导出到db1并在那里运行查询。

对于导出部分,您可以使用mysql内置导出/导入功能,您必须考虑查找未使用的表名或使用CSV - export / import的mysql。

如果内部查询的预期结果数量相当小,您可以使用字符串从PHP内部进行传输:

$ids = query($db1, "SELECT GROUP_CONCAT(id) FROM accounts");
query($db2, "DELETE FROM players WHERE acc NOT IN ($ids)");

答案 2 :(得分:0)

语法database.table.field实际上应该在MySQL中有效。 但我猜你要直接在MySQL服务器上运行查询。不确定。

您是否尝试过以下操作?

DELETE FROM db1.players WHERE db1.players.acc NOT IN (SELECT db2.accounts.id FROM db2.accounts)

或者我错了,两个数据库不在同一台服务器上? 看看这里:http://www.dottedidesign.com/node/14

答案 3 :(得分:0)

我会尝试类似的事情:

  • 为本地服务器上的ID创建临时表
  • 从远程服务器获取ID的语句
  • 准备好将ids插入temp的语句。表
  • 转移ids remote-> local
  • 使用temp.table
  • 删除
<?php
$pdoRemote = new PDO('mysql:host=somewhere.else;dbname=foo', '...', '...');
$pdoRemote->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdoLocal = new PDO('mysql:host=localhost;dbname=bar', '...', '...');
$pdoLocal->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdoLocal->exec('CREATE TEMPORARY TABLE remoteIds ( id int )'); // maybe engine=heap
$stmtLocal = $pdoLocal->prepare('INSERT INTO remoteIds (id) VALUES (:id)');
$stmtLocal->bindParam(':id', $id);

foreach( $pdoRemote->query('SELECT id FROM accounts') as $row ) {
    $id = $row['id'];
    $stmtLocal->execute();
}
unset($pdoRemote);

答案 4 :(得分:0)

要使用单个查询在不同服务器上查询多个数据库,您可以使用federated tables

您还可以使用复制或临时表。这样就可以访问同一台服务器上的数据库了。

我能想到的唯一其他选择是使用MySQL Proxy将您的查询解析为2个或更多查询。

我认为我说你不能按照使用sp_addlinkedserver程序使用MSSQL的方式来做到这一点。

使用两个查询可能会更好。