Mysql 触发器更新插入的行

Mysql trigger to update the inserted row

我遇到了一个问题:我想使用触发器更新插入到 table 的记录:

DELIMITER $$
CREATE TRIGGER moodle.update_lang
AFTER INSERT
ON moodle.mdl_user FOR EACH ROW
BEGIN
   update moodle.mdl_user SET lang='hu' WHERE lang='en';
END$$
DELIMITER ;

所以当我现在想插入一行时,它给我一个错误,因为一个过程已经在使用它,所以无法插入该行。你能给出任何解决方案如何使这项工作吗?这种方法是否可用,还是我应该从不同的角度来解决问题?提前致谢!

根据评论:)

您需要一个 BEFORE INSERT 触发器。在该触发器中,您可以在记录到达永久存储之前对其进行更改。使用您的示例,此触发器将定义如下:

DELIMITER $$
CREATE TRIGGER moodle.update_lang
BEFORE INSERT
ON moodle.mdl_user FOR EACH ROW
BEGIN
   SET NEW.lang='hu';
END$$
DELIMITER ;

你不能在触发器引用的同一个 table 上使用 UPDATE 的原因是因为这可能(并且会)导致无限循环。

注意:我没有对此进行测试,但根据您的评论判断它似乎有效。祝你好运!

我不推荐使用数据库触发器,因为 Moodle 可以使用多个数据库。您以后可能需要转移到另一个数据库。

您可以在站点管理-> 语言-> 语言设置-> 默认语言中设置默认语言。或者直接到 /admin/settings.php?section=langsettings

或将此添加到 config.php

$CFG->lang = 'hu';

或响应user_created事件并更新记录

https://docs.moodle.org/dev/Events_API#Handling_an_event

创建本地插件

https://docs.moodle.org/dev/Local_plugins

然后添加以下代码:

local/yourplugin/db/events.php

$handlers = array (
    'user_created' => array (
        'handlerfile'      => '/local/yourplugin/locallib.php',
        'handlerfunction'  => 'local_yourplugin_user_created',
        'schedule'         => 'instant',
        'internal'         => 1,
    ),
);

然后在/local/yourplugin/locallib.php

function local_yourplugin_user_created($eventdata) {
    global $DB;

    $userid = $eventdata->objectid;

    $DB->set_field('user', 'lang', 'hu', array('id' => $userid);

    return true;
}