【问题标题】:Syntax ERROR inside MySQL TRIGGER -> Insert Into StatementMySQL TRIGGER 中的语法错误-> 插入语句
【发布时间】:2015-01-12 03:08:25
【问题描述】:

我有一个将新行插入另一个表的触发器,但是在某处出现错误,因为它告诉我我的值是 NULL 并且它们不是,或者至少它们不应该是。

触发器代码

分隔符 //

CREATE TRIGGER new_active_user AFTER UPDATE ON `pre_reg`
FOR EACH ROW
BEGIN
    DECLARE currentUser INT;
    DECLARE banned INT;
    DECLARE user_type INT;
    DECLARE username VARCHAR (25);
    DECLARE password VARCHAR (60);
    DECLARE usersince datetime;
    DECLARE email varchar(40);
    SET @currentUser := (select `id` FROM `pre_reg` WHERE `active` = 1);
    SET @banned = 0;
    SET @user_type = 3;
    SET @username := (select `username` FROM `pre_reg` WHERE `id` = currentUser);
    SET @password := (select `password` FROM `pre_reg` WHERE `id` = currentUser);
    SET @usersince := (select `date` FROM `pre_reg` WHERE `id` = currentUser);
    SET @email := (select `email` FROM `pre_reg` WHERE `id` = currentUser);
    INSERT INTO `users` (`id`, `username`, `password`) VALUES (@currentUser, @username, @password);
END//
Delimiter ;

我什至尝试在 SET 用户名、密码、电子邮件 SET 语句中对 currentUser 的值进行硬编码。但是它不起作用我收到以下错误:

错误

SQLSTATE[23000]:违反完整性约束:1048 列“用户名”不能为空

我什至尝试只输入 ID (@currentUser) 以确保其设置和其余部分是硬编码的(工作正常!所以我认为错误在 SET 语句中,但无法弄清楚它总是告诉我什么该值为NULL

这就是我创建表格的方式

CREATE TABLE `pre_reg` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(25) NOT NULL,
 `password` varchar(60) NOT NULL,
 `email` varchar(40) NOT NULL,
 `authentication` varchar(32) NOT NULL,
 `active` smallint(1) NOT NULL DEFAULT '0',
 `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 UNIQUE KEY `username` (`username`,`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
GO
CREATE TABLE `users` (
`id` INT PRIMARY KEY,
`username` VARCHAR (25) NOT NULL,
`password` VARCHAR (60) NOT NULL,
`banned` SMALLINT NOT NULL DEFAULT 0,
`user_since` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
)ENGINE=InnoDB DEFAULT CHARSET=latin1
GO

【问题讨论】:

  • 如果这是更新后触发器,为什么不使用new?
  • 用表格更新了问题,还有@Gordon 你是什么意思新?正如你所知道的那样,我是新的:),所以不确定你的意思!在此先感谢各位!
  • 他是说存在操作数(新旧)可与触发器一起使用以使用您更新/插入/删除的值,您无需查询然后在此处查看:dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

标签: mysql sql


【解决方案1】:

这可能就是你想要的:

Delimiter //

CREATE TRIGGER new_active_user AFTER UPDATE ON `pre_reg`
FOR EACH ROW
BEGIN
    INSERT INTO `users` (`id`, `username`, `password`)
        VALUES (new.id, new.username, new.password);
END//
Delimiter ;

无论pre_reg 中刚刚更新的内容,它都会插入到users 表中。

【讨论】:

  • 我会试试这个......会让你知道谢谢你帮助我并解释操作数新(天气它适用于我的情况,或者至少我学到了一些新东西)谢谢!
  • 这行得通,但是它给我一个错误:SQLSTATE [HY000]:一般错误...但它完成了我要求创建新行的所有操作
  • @theStudent 。 . .嗯,如果数据库实际上正在被修改,那么触发器正在运行。这表明错误在其他地方。
  • 好的,感谢您的时间和帮助,非常感谢 Gordon!我会继续寻找!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多