首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨两个不同用户的数据库的MySQL查询

跨两个不同用户的数据库的MySQL查询
EN

Stack Overflow用户
提问于 2011-10-21 03:51:33
回答 3查看 3.3K关注 0票数 1

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

PHP脚本片段:

代码语言:javascript
复制
$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>";

So..in上面的{$sam_db}数据库是由不同于{$joomla_db}用户的用户访问的...

在这之后还有更复杂的插入,但我认为如果我能让上面的方法起作用,那么我很可能能够将同样的原则应用于其他插入查询……

EN

回答 3

Stack Overflow用户

发布于 2011-10-21 03:54:43

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

如下所示:

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2011-10-21 03:54:58

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

然后使用这两种方法并进行单独的查询。

解释一下。

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

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

在那里,您可以使用代码进行提取和插入。

票数 1
EN

Stack Overflow用户

发布于 2011-10-21 04:16:25

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

代码语言:javascript
复制
SELECT a.*, b.*
FROM db1.table1 a
INNER JOIN db2.table2 b ON (a.id = b.id)

将毫无问题地运行,您的insert查询也是如此。

但是,启动查询的用户需要对所涉及的数据库和表具有适当的访问权限。

这意味着user1 (执行插入操作)必须具有表{$joomla_db}.jos_muscol_artistsgrant权限和{$sam_db}.songlist的select权限

如果您不想扩展现有用户的权限,那么您可以只创建一个新的inserter用户,该用户具有以适当的方式使用这两个数据库的适当的访问权限。

仅使用此用户执行插入操作。

无需添加用户的替代解决方案

另一种选择是在db1 (您从中选择的数据库)上创建一个黑洞表

代码语言:javascript
复制
CREATE TABLE db1.bh_insert_into_db2 (
  f1 integer,
  f2 varchar(255),
  f3 varchar(255)
) ENGINE = BLACKHOLE;

并将触发器附加到执行插入到db2中的触发器。

代码语言:javascript
复制
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 ; 

insert into table db2.table2将使用用户如何创建触发器的访问权限进行。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7841442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档