【问题标题】:MYSQL Update across tables not working跨表的MYSQL更新不起作用
【发布时间】:2013-01-05 00:52:53
【问题描述】:

我正在尝试用另一个表列中的数据填充一个表的一列中的所有行,并使用产品代码将它们全部结合起来。

所以aatest.stock 更新products_attributes.attributes_part_number

这就是我所拥有的:

$dbh = new PDO('mysql:host=localhost;dbname='. 
           DB_DATABASE, DB_SERVER_USERNAME, DB_SERVER_PASSWORD);

$dbh->exec('UPDATE products_attributes 
        SET aatest.code = products_attributes.attributes_part_number 
        WHERE products_attributes.attributes_stock = aatest.stock');

    ?>

任何关于为什么这不起作用的建议将不胜感激。

我正在运行 MySQL 5.5

【问题讨论】:

  • 您有任何错误吗?您是否尝试过调试,是否尝试在执行前打印您的语句以检查它是否正确。
  • 我觉得应该是UPDATE aatest SET code = products_attributes.attributes_part_number WHERE products_attributes.attributes_stock = aatest.stock
  • @Philip Whitehouse:这将引发错误,因为这不包括对 products_attributes 表的引用。

标签: php mysql sql pdo


【解决方案1】:

您的语句“不起作用”的原因是因为它是无效的 MySQL 语法。

http://dev.mysql.com/doc/refman/5.5/en/update.html

这样的事情应该会得到你想要的结果, 将aatest 表中的code 列设置为从products_attributes 表列检索到的值:

UPDATE aatest
  JOIN products_attributes 
    ON aatest.stock = products_attributes.attributes_stock
   SET aatest.code = products_attributes.attributes_part_number

如果要避免使用 JOIN 关键字,可以改用逗号运算符,并将连接谓词从 ON 子句移至 WHERE 子句:

UPDATE aatest
     , products_attributes 
   SET aatest.code = products_attributes.attributes_part_number
 WHERE aatest.stock = products_attributes.attributes_stock

(但连接语法的逗号风格是老派,我们更喜欢JOIN ... ON 风格。)

我得到这样一个语句的方法是从一个 SELECT 语句开始,像这样:

SELECT *
  FROM aatest
  JOIN products_attributes 
    ON aatest.stock = products_attributes.attributes_stock

(如果是很多列,当然我会指定感兴趣的列。)

SELECT 让我看看将要更新哪些行、code 列的当前值(来自 aatest)以及将分配的新值。

一旦我得到这个工作,我可以用“UPDATE”关键字替换“SELECT * FROM”,然后添加一个SET子句来指定要更新的列。

  SET aatest.code = expr 

(关于更新语法的奇怪之处在于SET 子句需要出现在WHERE 子句之前。)

【讨论】:

  • 感谢您提供如此详细的回复。我们现在似乎到了某个地方:D 我现在遇到的问题是整个列都被第一行的数据填充。
  • $dbh->exec('SELECT * FROM aatest JOIN products_attributes ON aatest.stock = products_attributes.attributes_stock'); $dbh->exec('UPDATE products_attributes JOIN aatest SET products_attributes.attributes_stock = aatest.stock');
【解决方案2】:

您需要在 UPDATE 语句中添加两个表之间的连接。

类似这样的:

UPDATE aatest
       JOIN products_attributes on products_attributes.attributes_stock = aatest.stock
        SET aatest.code = products_attributes.attributes_part_number 

【讨论】:

  • WHERE products_attributes.attributes_stock = aatest.stock 是隐式内连接
  • atest 是包含数据的表名,认为这是两者之间的链接。我是不是搞错了?
  • 您需要在语句的第一部分中包含 aatest 表。通常它是UPDATE 语句中的第一个表。
  • 我交换了表格的顺序,因为我通常把更新的表格放在第一位。
  • 哇,感谢大家的快速响应。汤姆,我试过了,还是不行。
【解决方案3】:

试试:

UPDATE products_attributes, aatest 
    SET aatest.code = products_attributes.attributes_part_number 
        WHERE products_attributes.attributes_stock = aatest.stock

【讨论】:

  • 我认为您需要在 2 个表名之间使用逗号。否则 MYSQL 将假定 aatest 是 products_attributes 表的别名。
【解决方案4】:

感谢大家的所有意见,这真的很有帮助。最后正确的代码是这样的:

$dbh->exec('UPDATE products_attributes, aatest 
            SET products_attributes.attributes_stock = aatest.stock 
            WHERE products_attributes.attributes_part_number = aatest.code');

但是,我在拔掉头发几个小时后发现的问题是,我在 MYSQL 中创建的表与我尝试与之交换数据的表有不同的编码(默认设置)。呵呵!

希望这可以帮助另一个崭露头角的程序员,那是他自己最大的敌人,就像我一样:D

再次感谢您的所有意见。被你们如此迅速地试图提供帮助而不知所措.. 对我来说是第一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多