Çoklu veritabanları arasında satırları sil

5 Cevap php

PHP ve MySQL kullanıyorum. Ben bir sorgu yapmak gerekir:

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

Sorun db1 ve DB2 farklı sunucularda bulunan olmasıdır. Bu tür sorun için hızlı çözüm nedir?

Kesin olmak için: ben 2 bağlantılarını kullanarak değilim, bu yüzden ben bunun için bir sorgu kullanabilirsiniz olamaz düşünüyorum.

5 Cevap

Bir dizi istediğiniz listesini kaydetmek zveyaunda ve diğer veritabanı ile karşılaştırın ya

veya

You can make a federated table and make it seem like the query is running on 1 database.

Bu hızlı olup olmadığını bilmiyorum, ama ben hesap kimlikleri içeren DB2 üzerinde geçici bir tablo oluşturmak istiyorum, db1 bu tabloyu vermek ve orada sorguyu çalıştırın.

Ihracat bölümü için kullanılmayan bir tablo adı bulma düşünün veya CSV-export / import mysql kullanmak zorunda mysql yerleşik ihracat / ithalat fonksiyonları kullanabilir ya.

Iç sorgunun sonuçlarının beklenen sayısı oldukça az ise, dizelerini kullanarak PHP içinde aktarabilirsiniz:

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

The syntax database.table.field should actually work in MySQL. But I guess you've to run the query directly on the MySQL server. Not sure about this.

Eğer aşağıdaki denediniz mi?

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

Or did I get you wrong and the two databases are not on the same server? Have a look here: http://www.dottedidesign.com/node/14

Ben böyle bir şey denemek istiyorum:

  • yerel sunucuda kimlikleri için geçici bir tablo oluşturmak
  • uzak sunucudan kimlikleri almak için deyim
  • temp içine kimlikleri eklemek için açıklama hazırladı. tablo
  • aktarma kimlikleri uzak-> yerel
  • Temp.table kullanarak SİL
<?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);

Eğer kullanabileceğiniz tek bir sorgu kullanarak, farklı sunucularda birden fazla veritabanı sorgulamak için federated tables.

Ayrıca çoğaltma, ya da geçici tablolar kullanabilirsiniz. Eğer aynı sunucuda veritabanlarına erişerek ediyoruz bu şekilde.

Aklıma tek alternatif MySQL Proxy 2 veya daha fazla sorgulama içine sorgu ayrıştırmak için kullanmak olacaktır.

Ben doğru bunu size sp_addlinkedserver prosedürü kullanarak MSSQL ile mümkün bulunmaktadır şekilde yapamaz söyleyerek olduğumu düşünüyorum.

Daha iyi iki sorgu kullanıyor olabilirsiniz.