用户表:
CREATE TABLE `users` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(45) DEFAULT NULL, `username` varchar(16) DEFAULT NULL, `salt` varchar(16) DEFAULT NULL, `password` varchar(128) DEFAULT NULL, `lastlogin` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `joined` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `loggedin` tinyint(1) unsigned NOT NULL DEFAULT '0', `sessionkey` varchar(60) DEFAULT NULL, `verifycode` varchar(16) DEFAULT NULL, `verified` tinyint(1) unsigned NOT NULL DEFAULT '0', `banned` tinyint(1) unsigned NOT NULL DEFAULT '0', `locked` tinyint(1) unsigned NOT NULL DEFAULT '0', `ip_address` varchar(45) DEFAULT NULL, `failedattempts` tinyint(1) unsigned NOT NULL DEFAULT '0', `unlocktime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
user_records表:
CREATE TABLE `user_records` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT, `userid` int(8) unsigned DEFAULT NULL, `action` varchar(100) DEFAULT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
在用户表上的插入前触发器:
USE `gknet`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` TRIGGER `before_create_user` BEFORE INSERT ON `users` FOR EACH ROW BEGIN INSERT INTO user_records (action, userid, timestamp) VALUES ('CREATED', ID, NOW() ); END
基本上,这里的问题是,当我尝试输入由MySQL自动分配的用户的ID(PK,NN,自动递增)时,在触发器上,它只是将user_records表中的userid放入0。我该怎么做,以便它将选择SQL分配给用户的ID,并将其作为用户ID放入记录条目中(该ID在“创建”之后)?
另外,如果您看到可以在表格上进行其他优化,请随时告诉我:D
OP的评论: 您之前会怎么做?
您可以找到auto_increment要分配给新记录的当前值。 并在before触发器中使用与user_records表的父用户ID 相同的触发器。 您必须查询information_schema.tables表以找到该值。
auto_increment
before
user_records
information_schema.tables
范例 :
use `gknet`; delimiter $$ drop trigger if exists before_create_user; $$ create definer=`root`@`localhost` trigger `before_create_user` before insert on `users` for each row begin declare fk_parent_user_id int default 0; select auto_increment into fk_parent_user_id from information_schema.tables where table_name = 'users' and table_schema = database(); insert into user_records ( action, userid, timestamp ) values ( 'created', fk_parent_user_id, now() ); end; $$ delimiter ;
观察结果 : 根据 last_insert_id() 上的mysql文档 ****,
“ 如果使用单个INSERT语句插入多行,则仅LAST_INSERT_ID()返回为第一行插入而生成的值。 ”
LAST_INSERT_ID()
因此,批量插入中的依靠last_insert_id()和auto_increment字段值似乎不可靠。
last_insert_id()