MySQL批量新增和批量更新

注意事项:mysql语句长度有限制,并不是越长越好,具体可以查看mysql的配置文件(Windows系统下是my.ini,Linux系统下是my.cnf)中max_allowed_packet属性(默认是1M),并进行相应设置(比如max_allowed_packet = 20M);


批量新增

SQL语句示例

INSERT INTO table_name (col_name1, col_name2, ...) VALUES (col_value1,col_value2, ...),(col_value1,col_value2, ...);

PHP代码示例

$users = array( 
    array('name' => 'test', 'age' => 20),
    array('name' => 'test1', 'age' => 21),
    array('name' => 'test2', 'age' => 22)
); 
$sql = "INSERT INTO users (name, age) VALUES "; 
foreach ($users as $key => $value) {
    $key != 0 && $sql .= ',';
    $sql .= sprintf("('%s',%s)", $value['name'], $value['age']); 
}
echo $sql;

批量更新

CASE WHEN批量更新
SQL语句示例

UPDATE table_name 
    SET update_col1 = CASE where_col1 
        WHEN where_val1 THEN update_val1 
        WHEN where_val2 THEN update_val2 
        WHEN where_val3 THEN update_val3 
    END, 
    update_col2 = CASE where_col2 
        WHEN where_val4 THEN update_val4
        WHEN where_val5 THEN update_val5
    END
WHERE where_col1 IN (where_val1,where_val2,where_val3);

PHP代码示例

//注意事项:CASE WHEN批量更新方法比较适合更新单个字段的业务场景,当业务需要更新多个字段时用CASE WHEN批量更新方法PHP实现不方便,需要多个循环拼接SQL语句
$display_order = array( 
    1 => 4, 
    2 => 1, 
    3 => 2, 
    4 => 3, 
    5 => 9, 
    6 => 5, 
    7 => 8, 
    8 => 9 
); 
$ids = implode(',', array_keys($display_order)); 
$sql = "UPDATE categories SET display_order = CASE id "; 
foreach ($display_order as $id => $ordinal) { 
    $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); 
} 
$sql .= "END WHERE id IN ($ids)"; 
echo $sql;

ON DUPLICATE KEY UPDATE批量更新(推荐)
SQL语句示例

INSERT INTO table_name (`id`, `col_name1`, `col_name2`)
VALUES
(1, 'col1_val1', 'col2_val1'),
(2, 'col_val2', 'col2_val2') 
ON DUPLICATE KEY UPDATE 
col_name1 = VALUES(col_name1),
col_name2 = VALUES(col_name2);

PHP代码示例

//ON DUPLICATE KEY UPDATE批量更新方法既适用于单个字段更新也适用于多个字段更新
$users = array( 
    array('id' => 1, 'name' => 'test', 'age' => 20),
    array('id' => 2, 'name' => 'test2', 'age' => 22),
    array('id' => 3, 'name' => 'test3', 'age' => 23)
); 
$sql = "INSERT INTO users (`id`, `name`, `age`) VALUES "; 
foreach ($users as $key => $value) { 
	$key != 0 && $sql .= ',';
    $sql .= sprintf("(%d,%s,%s)", $value['id'], $value['name'], $value['age']); 
} 
$sql .= " ON DUPLICATE KEY UPDATE name = VALUES(name), age = VALUES(age); "; 
echo $sql;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL批量更新是通过一次性更新多条记录,以提高更新效率和性能的一种方法。常见的MySQL批量更新方法有以下几种: 1. 使用REPLACE INTO批量更新:通过将需要更新的记录一次性插入到一个临时表中,然后使用REPLACE INTO语句将临时表中的数据更新到目标表中。这种方法需要用户具有temporary表的create权限。 2. 使用INSERT INTO ... ON DUPLICATE KEY UPDATE批量更新:通过使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句,可以将需要更新的记录一次性插入到目标表中,如果有重复的记录,则进行更新操作。这种方法适用于目标表有唯一索引或主键的情况。 3. 使用多值语法进行批量更新:通过使用多个值的语法,可以一次性更新多条记录。例如,使用UPDATE语句的多值语法:UPDATE table SET column1 = value1, column2 = value2 WHERE condition,其中value1和value2表示需要更新的多个值。 4. 使用LOAD DATA INFILE进行批量更新:通过将需要更新的数据保存在一个文本文件中,然后使用LOAD DATA INFILE语句将文本文件中的数据批量导入到目标表中。这种方法对于大规模的批量更新非常高效。 需要根据具体的需求和场景选择合适的MySQL批量更新方法。使用批量更新可以显著提高更新效率和性能,避免了逐条更新的低效率和可能导致阻塞的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [大批量更新数据mysql批量更新的四种方法](https://blog.csdn.net/Carey_Lu/article/details/118793662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [MySQL批量更新的四种方法](https://blog.csdn.net/weixin_45707610/article/details/130900245)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值