用户表:
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
表以找到该值。
范例 :
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()
和auto_increment
字段值似乎不可靠。
也许有人能帮我澄清一下。 我正在尝试编写一个插入前触发器,如果它留空,可以设置关闭。这可能吗? 没有太多代码可显示。我所做的只是创建了一个带有调试语句的简单的插入前触发器,以确保我的触发器在验证规则之前执行。似乎验证规则是第一位的(我显然无法更改它)。触发器永远不会触发。 这是可行的还是不可能的?
问题内容: 使用MySQL 5.1.49,我正在尝试实现一个标记系统,我的问题是有两列的表:, (InnoDB) 使用query时,即使忽略了插入,自动增量值也会增加。 通常,这不会有问题,但是我希望有很多尝试为该特定表插入重复项,这意味着我下一个新行字段的值将跳得太多。 例如,我最终得到一个表,该表具有3行,但错误的是 另外,如果我不做而只是定期做并处理错误,则自动递增字段仍会增加,因此下一个真
是否可以更改此触发器,以便表获得插入的2个列值(,)? 如何找到的值? 如果它是已知的并且可以插入表,那么它是否也可以插入表? 创建表排序顺序: 创建表图像: 错误消息: 错误1054:“new”SQL语句中的列“sortOrder”未知: 在INSERT ON image之前为每一行开始INSERT to nextcart.sortOrder设置sortOrderId=NULL,sortOrde
问题内容: 我有一个带有主键字段且具有AUTO_INCREMENT的MySQL表。在阅读了这里的其他文章后,我发现人们遇到了同样的问题,答案也各不相同。有些人建议不要使用此功能,其他人则说它不能被“修复”。 我有: 示例:表中的记录数:18.如果我删除记录16、17和18-我希望输入的下一条记录的courseID为16,但是由于最后输入的courseID为18,所以它将为19。 我的SQL知识不是
现在我想从nodejs插入。我已经试过了,但不起作用
问题内容: 我对此有些困惑。我一直在阅读有关内容,并计划将其用于文本区域以防止XSS攻击。我了解通常用于生成发送到浏览器的HTML输出。但是我不确定的是: 1)在将数据插入MySQL之前,先对用户输入的数据进行使用是一种安全的做法吗?我已经在使用带有参数化值的PDO准备好的语句来防止SQL注入。 2)或者,我真的不需要担心要使用插入值(只要已对它们进行了参数化)而仅在我从MySQL获取结果并将其显