mysql - 将行从一个表移动到另一个表或更新

时间:2011-11-04 22:35:55

标签: php mysql

PLOT:我有一个有2个DB的PAD网站:submitdata和maindata。 submitdata DB将所有列作为maindata DB加上另外3列:

MAINDATA COLUMNS:名称链接电子邮件网站.... progid SUBMITDATA COLUMNS:名称链接电子邮件网站.... progid,backlink,affiliateid

我必须将所有行从submitdata DB移动到maindata DB,但只有IF反向链接!=''和IF affiliateid!= $ affiliateid。

另一个问题是如果progid已经在maindata数据库中,并且在这种情况下我必须使用新数据更新该行 ...另一个问题是我有大约40,000行,所以SELECT * FROM submitdata有点杀了我的电脑。

有关如何在PHP中执行此操作的任何想法吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

EXPLAIN SELECT * FROM submitdata;

也许它会告诉你哪些字段可以给INDEX(这可以大大加快查询时间)。然后,如果您不打算移动其反向链接和affiliateid字段为空的记录,则可以通过添加WHERE子句来减少查询中的结果集。

$result = mysql_query('SELECT * FROM submitdata WHERE backlink <> "" AND affiliateid <> ""');
if ($result) {
    while ($row = mysql_fetch_assoc($result)) {
        $newResult = mysql_query(sprintf('SELECT name,progid FROM maindata WHERE progid = %d', $row['progid']));
        $row2 = mysql_fetch_row($newResult);
        if ($row2) {
            // do UPDATE query
        } else {
            // do INSERT query
        }
    }
}

答案 1 :(得分:1)

您可以获取MySQL帮助并让它完成所有工作,而不是在应用程序层中执行此操作。构建查询,然后使用PHP / Perl等提交它。

INSERT INTO MAINDATA
(col1, col2, col3....)
SELECT col1, col2... FROM
(
    SELECT col1, col2...
    FROM SUBMITDATA SD
    LEFT OUTER JOIN MAINDATA MD
      ON SD.key1 = MD.key1 and SD.key2 = MD.key
    WHERE
          SD.backlink <> ''
      AND SD.affiliate <> '$affiliatiid'
) ND
ON DUPLICATE KEY
   SET update_col1 = col1
      ,update_col2 = ...

基本上,子查询得到的所有行都符合反引号!=''和affiliate!= affiliateid的条件。 MySQL将尝试将它们插入到MainData中,如果该行已存在(基于PK / UK),它将更新您在SET子句中给出的列。

注意:如果两个DB都在一个mysql服务器下,该方法将起作用。