触发器内的两个插入语句 - 键“PRIMARY”的重复条目“521-2”

Lui*_*uis 3 mysql trigger

我正在尝试创建一个插入触发器,以便当新用户插入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在它以某种方式可用之前读取该值。

我该如何解决这个问题?

ype*_*eᵀᴹ 5

我对类似的情况感到困惑。使用变量来存储值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)