MySQL查询跨越2个不同用户的数据库

时间:2011-10-20 19:51:33

标签: mysql

我有一个mysql查询,它连接2个数据库中的数据并将新记录插入其中一个数据库。如果相同的mysql用户可以访问两个数据库并且两者都在同一服务器上,则下面的查询有效。但是,如果每个数据库具有不同的用户凭据,您将如何重写?

PHP脚本代码段:

$hard = mysql_connect($hostname_hard, $username_hard, $password_hard) 
        or trigger_error(mysql_error(),E_USER_ERROR); 

# Insert artists:
mysql_select_db($database_hard, $hard);
$query_artsync = "insert ignore into {$joomla_db}.jos_muscol_artists 
                   (artist_name, letter, added,url,class_name)  
                 select distinct 
                   artist
                   , left(artist,1) as letter
                   , now()
                   , website, artist 
                 from {$sam_db}.songlist 
                 where (songtype='s' AND artist <>\"\")";
mysql_query($query_artsync, $hard) or die(mysql_error());
echo "<br>Artist tables merged! <br><br> Now merging albums<br><br>";

所以..在上面,{$sam_db}数据库由与{$joomla_db}用户不同的用户访问...
在这个之后有更复杂的插入,但我想如果我可以使上述工作,那么我可能能够将相同的原则应用于其他插入查询...

3 个答案:

答案 0 :(得分:1)

您正在谈论在同一查询中使用2个不同的连接,遗憾的是,这是不可能的。您需要做的是从一个数据库中获取(选择)您需要的所有信息,并使用该信息在另一个数据库上构建插入查询(2个单独的查询)。

这样的事情:

$result = mysql_query("SELECT DISTINCT artist, LEFT(artist,1) AS letter, now() as added, website
  FROM {$sam_db}.songlist
  WHERE (songtype='s' AND artist <>\"\"", $sam_con);
while(($row = mysql_fetch_assoc($result)) != false)
{
  $artist = mysql_real_escape_string($row['artist']);
  $letter = mysql_real_escape_string($row['letter']);
  $added = mysql_real_escape_string($row['added']);
  $website = mysql_real_escape_string($row['website']);
  mysql_query("INSERT IGNORE INTO {$joomla_db}.jos_muscol_artists 
    (artist_name, letter, added,url,class_name)
    VALUES
    ('$artist', '$letter', '$added', '$website', '$artist')", $joomla_con);
}

其中$ sam_con和$ joomla_con是您的连接资源。

答案 1 :(得分:1)

以PHP为例,您必须创建2个唯一的mysql实例,每个连接1个。

然后使用两者并进行单独查询。

解释......

例如,使用mysql_connect设置与两个数据库的连接。现在,您现在已经定义了连接变量......

mysql_query中,您应用了这些变量,例如mysql_query($query, $connect1)mysql_query($query, $connect2)

从那里你可以使用代码提取和插入。

答案 2 :(得分:1)

查询不同数据库中的表是没有问题的。

SELECT a.*, b.*
FROM db1.table1 a
INNER JOIN db2.table2 b ON (a.id = b.id)

运行时没有任何问题,插入查询也是如此 但是启动查询的用户需要具有对所涉及的数据库和表的适当访问权限。

这意味着user1(执行插入的人)必须grant插入+选择表{$joomla_db}.jos_muscol_artists的权限并选择{$sam_db}.songlist的权限

如果您不想扩展现有用户的权限,则可以创建一个具有适当访问权限的新inserter用户,以便以正确的方式使用这两个数据库。
仅使用此用户进行插入。

无需添加用户的替代解决方案
另一种选择是在db1上创建一个黑洞表(你选择的数据库)

CREATE TABLE db1.bh_insert_into_db2 (
  f1 integer,
  f2 varchar(255),
  f3 varchar(255)
) ENGINE = BLACKHOLE;

将一个触发器附加到插入db2的那个。

DELIMITER $$

CREATE TRIGGER ai_bh_insert_into_db2_each ON bh_insert_into_db2 FOR EACH ROW
BEGIN
  INSERT INTO db2.table2 (f1,f2,f3) VALUES (NEW.f1, NEW.f2, NEW.f3);
END $$

DELIMITER ; 

db2.table2中的插入将与用户的访问权限一起发生,如何创建触发器。

http://dev.mysql.com/doc/refman/5.1/en/grant.html