请考虑下表test
:
CREATE TABLE test(col1 int, col2 varchar, col3 date);
INSERT INTO test VALUES
(1,'abc','2015-09-10')
, (1,'abc','2015-09-11')
, (2,'xyz','2015-09-12')
, (2,'xyz','2015-09-13')
, (3,'tcs','2015-01-15')
, (3,'tcs','2015-01-18');
Run Code Online (Sandbox Code Playgroud)
postgres=# select * from test;
col1 | col2 | col3
------+------+------------
1 | abc | 2015-09-10
1 | abc | 2015-09-11
2 | xyz | 2015-09-12
2 | xyz | 2015-09-13
3 | tcs | 2015-01-15
3 | tcs | 2015-01-18
Run Code Online (Sandbox Code Playgroud)
我想要一个按日期 desc 排序的返回集合:
col1 | col2 | col3
------+------+------------
2 | xyz | …
Run Code Online (Sandbox Code Playgroud) postgresql order-by greatest-n-per-group distinct postgresql-9.6
我正在尝试创建一个插入触发器,以便当新用户插入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
在它以某种方式可用之前读取该值。
我该如何解决这个问题?