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。
我有一个名为 '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。