【问题标题】:MySQL Issue Copying from one table into another directlyMySQL问题直接从一个表复制到另一个表
【发布时间】:2010-09-30 21:44:52
【问题描述】:

我使用以下代码从一个表直接复制到另一个:

$transfer = $db->e​​xec("INSERT INTO table2 SELECT * FROM table1 WHERE groupname = '$gname'");

然而,我遇到的问题是两个表的 ID 字段不一定匹配(都是自动递增的),有时这可能意味着一个临时表的 ID# 高于最终表。

我使用 php、pdo 和 mysql。

有没有办法解决这个问题?

【问题讨论】:

    标签: php mysql insert pdo


    【解决方案1】:

    明确说明你想要什么列:

    "INSERT INTO table2 (`col_1`,`col_2`) SELECT `col_1`, `col_2` FROM table1 WHERE groupname = '$gname'"
    

    【讨论】:

    • 可以,但有 54 列。不好玩
    • 我从来没有说过它会很有趣......或者不会让人麻木......如果你设置一些基础设施来“分析”你实际上自动化的表模式。当然,这比输入列要多,但如果您可能在应用程序的其他部分将它用于不同的事情,那么它可能是值得的。或者您可以使用现有的数据访问层,例如 Zend_Db、Doctrine DBAL 或 Creole。
    【解决方案2】:
    "INSERT INTO final_table SELECT * FROM temp_table WHERE temp_table.groupname = '$gname'"
    

    问题出在哪里?如果两者都是 auto_increment,并且像你说的 temp_table 的 id 比 perm_table 高,你最终会得到正确的效果。

    【讨论】:

    • Menon - 你刚刚复制并粘贴了我提到我遇到问题的确切代码?最终表可以从多个来源更新,而不仅仅是 temp_table 所以理​​论上最终表可能在计数 400 而 temp 为 300 - 尝试插入 #301 会导致错误;
    • 我很抱歉,伙计。是的,粘贴相同的代码是故意的,我没有考虑其他来源添加数据的可能性。对不起,对不起。
    【解决方案3】:

    您还应该知道 MySQL 会阻止插入到选择表:

    http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

    【讨论】:

    • “块插入”是什么意思?您指的是“如果主键冲突”?
    • 阻塞通常是指等待其他东西的东西。 http://en.wikipedia.org/wiki/Blocking_(computing) INSERT 语句在您的 INSERT INTO .. SELECT ... 语句完成之前不会完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2012-08-12
    • 1970-01-01
    • 2012-06-09
    • 2011-11-21
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多