You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2迁移中批量执行SQL仅首条生效,如何实现逐条执行?

Yii2迁移中执行多条SQL语句的正确方式

Yii2默认不支持通过单条createCommand()->execute()执行多条SQL语句(多数数据库驱动出于安全考虑,会忽略分号后的语句),所以你拼接的多条SQL只会跑第一条。以下是几种解决办法:

1. 拆分SQL逐条执行

把拼接好的SQL按分号拆分,循环执行每条语句:

$sql = "UPDATE card_series SET Code = 903 WHERE ID = 1600; DELETE FROM card WHERE SeriesID = 1600;";
// 拆分并过滤空语句(避免分号结尾产生空条目)
$statements = array_filter(array_map('trim', explode(';', $sql)));

foreach ($statements as $stmt) {
    if ($stmt) {
        $this->db->createCommand($stmt)->execute();
    }
}

2. 使用Yii2迁移内置方法(推荐)

直接用迁移类提供的update、delete等方法,无需手动拼接SQL,还能自动处理参数绑定:

// 执行更新
$this->update('card_series', ['Code' => 903], ['ID' => 1600]);
// 执行删除
$this->delete('card', ['SeriesID' => 1600]);

这种方式更符合Yii2的开发规范,也能避免SQL注入风险。

3. 启用多语句执行(不推荐)

如果一定要用单条命令执行多条SQL,可修改数据库连接配置开启多语句支持,但存在注入风险,仅在完全可控的场景下使用:

// 配置文件中修改db连接
'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=your_db',
    'username' => 'root',
    'password' => 'your_pwd',
    'charset' => 'utf8',
    'attributes' => [
        PDO::MYSQL_ATTR_MULTI_STATEMENTS => true,
    ],
],

之后即可用原方式执行拼接好的SQL:

$this->db->createCommand($sql)->execute();

内容的提问来源于stack exchange,提问作者baby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:52:05