我正在尝试创建一个插入触发器,以便当新用户插入users
表中时(通过站点、httpd 和 php),此信息的一部分会插入到另一个管理对 wiki 的访问的表中。
新wiki用户表注册的用户id和默认组id(2)也应该插入到另一个wiki表中,这样一个新用户就属于一个默认组。
我这样编码:
USE users_web;
DELIMITER |
CREATE TRIGGER doku_users_ins AFTER INSERT ON users_web.users
FOR EACH ROW
BEGIN
INSERT INTO users_web.doku_users (login, pass, email)
VALUES (NEW.user, md5(NEW.pass), NEW.email);
INSERT INTO users_web.doku_usergroup (uid, gid)
SELECT du.uid, "2" FROM doku_users du
INNER JOIN users_web.users u ON NEW.user = du.login;
END |
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
如果触发器仅由第一条INSERT
语句组成,它运行良好,因为 doku_users 表插入了一个更多的寄存器。
但是当我像上面那样创建触发器时,使用这两个INSERT
语句,我收到一个错误作为反馈:Duplicate entry '521-2' for key 'PRIMARY'
.
我猜第二个 sql 语句试图NEW
在它以某种方式可用之前读取该值。
我该如何解决这个问题?
我对类似的情况感到困惑。使用变量来存储值NEW.column
并从第二个插入中删除连接:
USE users_web;
DELIMITER |
CREATE TRIGGER doku_users_ins AFTER INSERT ON users_web.users
FOR EACH ROW
BEGIN
DECLARE new_pass VARCHAR(255); -- choose the datatypes
DECLARE new_email VARCHAR(255); --
DECLARE new_user INT; --
SET new_pass = NEW.pass ;
SET new_email = NEW.email ;
SET new_user = NEW.user ;
INSERT INTO users_web.doku_users (login, pass, email)
VALUES (new_user, md5(new_pass), new_email);
INSERT INTO users_web.doku_usergroup (uid, gid)
SELECT du.uid, '2' FROM doku_users du
WHERE new_user = du.login;
END |
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11631 次 |
最近记录: |