Mysql 更新所有以相同名称开头的列

Mysql update all columns starting with same Name

我有一个名为 'products' 的动态 table,具有多种语言。 table 列如下所示:

id, product_id, store_de, store_en, store_fr, store_es... etc

语言可多可少。

现在我想更新此 table 并将所有以 "store_" 开头的列设置为值 1。

我尝试了以下方法:

$stmt = $dbh->prepare( "UPDATE products SET `store_%` = ? WHERE product_id = ?" );

$stmt->execute( array( 1, $lastID ) );

我收到以下错误消息:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'store%' in 'field list'

有没有办法更新所有以 'store_' 开头的列,或者我是否必须列出所有列?


根据 jekaby 的回答,这里是对我有用的完整解决方案:

$get_stores = $dbh->prepare("SHOW COLUMNS FROM products_active WHERE field REGEXP '^store'");
    $get_stores->execute();
    $stores = $get_stores->fetchAll();

    $update_string = "";
    $first_store = true;
    foreach($stores as $store) {
        if(!$first_store) {

            $update_string .= ", ";

        } else {

            $first_store = false;

        }
        $update_string .= $store['Field']." = '".$status."'";

    }

    $update_activity = $dbh->prepare("UPDATE products_active SET $update_string WHERE product_id = ?");
    $update_activity->execute(array($product_id));

您需要明确设置每一列。 SQL 不支持列名的通配符(SELECT ** 除外):

update products
    set store_de = 1,
        store_en = 1,
        store_fr = 1,
        store_es = 1,
        . . .
    where product_id = ?;

您的数据结构表明您确实想要 ProductStores table。每种语言(?)和每种产品都有一行。它至少有三列:

  • ProductId
  • Language
  • Value

那么你只需要做:

update ProductStores
    set Value = 1
    where ProductId = ?;

你不能这样做 store_% - 它在 table 中不存在,因为它写在你的错误中。

您应该得到名称如 /^store_/ (regexp) 的所有列。而不是更新列出它们的所有这些字段。

mysql> SHOW COLUMNS FROM products where field REGEXP '^store_'

比从 'Field' 收集所有字段...您可以阅读更多如何获取所有列 here