gpt4 book ai didi

mysql - 在插入触发器之前在 MYSQL 中使用自动增量值?

转载 作者:可可西里 更新时间:2023-11-01 06:27:45 24 4
gpt4 key购买 nike

用户表:

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 表上为用户 ID 输入 0 .我该怎么做才能选择由 SQL 分配给用户的 ID,并将其作为用户 ID 放入记录条目中(ID 就在“创建”之后)?

此外,如果您发现可以对表格进行任何其他优化,请随时告诉我 :D

最佳答案

OP's comment:
How would I do it before, thou?

您可以找到要分配给新记录的当前 auto_increment 值。
并在 before 触发器中使用相同的作为 user_records 表的父用户 ID。
您必须查询 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 ;

观察:
根据 mysql documentation on last_insert_id() ,

"if you insert multiple rows using a single INSERT statement, LAST_INSERT_ID() returns the value generated for the first inserted row only."

因此,依赖于 last_insert_id()auto_increment 字段值的批量插入似乎不可靠。

关于mysql - 在插入触发器之前在 MYSQL 中使用自动增量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24404540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com