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;
}
我遇到了一个问题:我想使用触发器更新插入到 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;
}