MySql select into与set的区别

本文通过一个具体的例子展示了在SQL存储过程中,使用SELECT...INTO和SET两种方式为变量赋值的区别。结果显示,当从不存在记录的表中选择时,SELECT...INTO不会改变目标变量的值,而SET结合子查询会将NULL值赋给变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

见代码:
DROP PROCEDURE IF EXISTS stat_cube.sp_test;
CREATE PROCEDURE stat_cube.`sp_test`( )
BEGIN
  
declare dt1,dt2 date default '2011-04-01';
  
  
select dt1,dt2;
  
  
select day_id into dt1 from stat_cube.dim_dt where 1<>1;
  
  
set dt2 = (select day_id from stat_cube.dim_dt where 1<>1);
    
  
select dt1,dt2;

END;

call stat_cube.sp_test();

结果 select into 之后的dt1没有值没有变化,还是‘2011-04-01’,而dt2的值变为null。

 

### 使用 `SELECT INTO` 进行批量插入 在 MySQL 中,可以利用 `SELECT INTO` 结合其他 SQL 语句来实现数据的批量插入或更新操作。具体方法如下: #### 批量插入新记录 当目标表不存在时,可以通过 `CREATE TABLE ... SELECT` 或者直接使用 `INSERT INTO ... SELECT` 来完成批量插入。 ```sql -- 创建新表并插入数据 CREATE TABLE new_table AS SELECT * FROM source_table WHERE condition; -- 向已有表中插入数据 INSERT INTO target_table (column_list) SELECT column_list FROM source_table WHERE condition; ``` 如果希望控制事务处理以提高性能,则可以在执行上述命令之前关闭自动提交模式[^1]: ```sql SET AUTOCOMMIT=0; START TRANSACTION; INSERT INTO target_table (column_list) SELECT column_list FROM source_table WHERE condition; COMMIT; SET AUTOCOMMIT=1; ``` #### 更新现有记录 对于需要基于某些条件更新多条记录的情况,通常会先创建临时表存储查询结果,再通过 `UPDATE JOIN` 的方式来进行批量更新。 ```sql -- 将要更新的数据放入临时表 CREATE TEMPORARY TABLE temp_update_data AS SELECT id, updated_value FROM source_table WHERE some_condition; -- 对目标表中的对应记录进行更新 UPDATE target_table t JOIN temp_update_data tmp ON t.id = tmp.id SET t.column_to_update = tmp.updated_value; DROP TEMPORARY TABLE IF EXISTS temp_update_data; ``` 同样地,在高并发场景下建议手动管理事务以优化效率。 #### 注意事项 - 当涉及大量数据迁移时,请务必考虑服务器资源消耗以及可能产生的锁竞争等问题。 - 如果是在生产环境中实施此类变更,强烈推荐事先做好充分测试,并准备好回滚方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值