我有一个mysql查询,它连接两个数据库中的数据,并将新记录插入其中一个数据库中。如果相同的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>";So..in上面的{$sam_db}数据库是由不同于{$joomla_db}用户的用户访问的...
在这之后还有更复杂的插入,但我认为如果我能让上面的方法起作用,那么我很可能能够将同样的原则应用于其他插入查询……
发布于 2011-10-21 03:54:43
您正在讨论的是在同一查询中使用两个不同的连接,不幸的是,这是不可能的。您需要做的是从一个数据库中获取(选择)所需的所有信息,并使用这些信息在另一个数据库上构建插入查询(两个单独的查询)。
如下所示:
$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是您的连接资源。
发布于 2011-10-21 03:54:58
以PHP为例,您必须创建2个唯一的mysql实例,每个连接1个。
然后使用这两种方法并进行单独的查询。
解释一下。
例如,使用mysql_connect设置到这两个数据库的连接。现在,您已经定义了连接变量...
在mysql_query中,您可以应用这些变量,例如mysql_query($query, $connect1)或mysql_query($query, $connect2)。
在那里,您可以使用代码进行提取和插入。
发布于 2011-10-21 04:16:25
从不同的数据库查询表是没有问题的。
SELECT a.*, b.*
FROM db1.table1 a
INNER JOIN db2.table2 b ON (a.id = b.id)将毫无问题地运行,您的insert查询也是如此。
但是,启动查询的用户需要对所涉及的数据库和表具有适当的访问权限。
这意味着user1 (执行插入操作)必须具有表{$joomla_db}.jos_muscol_artists的grant权限和{$sam_db}.songlist的select权限
如果您不想扩展现有用户的权限,那么您可以只创建一个新的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 ; insert into table db2.table2将使用用户如何创建触发器的访问权限进行。
https://stackoverflow.com/questions/7841442
复制相似问题