Mysql Before Insert Trigger SET失败

时间:2011-06-19 03:00:59

标签: mysql select triggers insert

我有一个相当简单的基本表,我将使用CHAR(4)主键填充。

这些值是从带有子查询的字符表中选择的。

我想设置一个 BEFORE INSERT 查询,以便每当我 INSERT 来自PHP的新记录时, id 字段应该得到从子查询生成的CHAR(4)。

“ASDF”,“这是正文”,“1970-01-01 01:01:01”

等等。

我用这个触发器拉出我的头发。

DELIMETER |
CREATE TRIGGER messages_newid 
BEFORE INSERT ON messages
FOR EACH ROW
BEGIN
  SET NEW.id = (SELECT CONCAT(a.val,b.val,c.val,d.val)
    FROM chars AS a
    JOIN chars AS b
    JOIN chars AS c
    JOIN chars AS d
    ORDER BY RAND()
    LIMIT 1);
END
|

以下是消息

的表格结构
CREATE TABLE IF NOT EXISTS `messages` (
  `id` varchar(4) collate utf8_unicode_ci NOT NULL,
  `body` text collate utf8_unicode_ci,
  `created` datetime default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我在另一个答案中找到了 chars 表格,其中用于CHAR(4)随机性

CREATE TABLE IF NOT EXISTS `chars` (
  `val` char(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

这与特权有什么关系?

编辑以下是新的错误代码

#1227 - Access denied; you need the SUPER privilege for this operation

2 个答案:

答案 0 :(得分:2)

修改:似乎所有链接的示例都使用//作为分隔符而不是|。您可能想尝试一下,看看它是否更好。

编辑2:如果从cPanel在PHPMyAdmin中运行它,则需要从SQL查询窗口下方的little text box Delimeter option控制分隔符,而不是DELIMETER它似乎忽略的命令。

此外,由于我是looking through examples,您似乎需要在触发器定义结束时将DELIMITER重置为; ,或者它似乎保持全局|并且会混淆未来的查询,包括运行时触发器本身的内容:

END
|
DELIMITER ;

答案 1 :(得分:2)

#1227 - Access denied; you need the SUPER privilege for this operation 

表示要执行create trigger,您必须拥有SUPER权限。以具有此类权限的用户身份登录并重新运行查询。

一些注意事项。
   你创建的触发器可能无法正常工作:你不能只写INSERT INTO messages(body, created) VALUES(some_text, some_datetime),你必须INSERT INTO messages(id, body, created) VALUES('text', some_text, some_datetime);(注意,你提供的'id'值会被你的触发);否则你将'Field id没有默认值错误',因为mysql在启动你的触发​​器之前检查非null约束。

最后,主键的值是随机的;它不适用于MyISAM表,但如果您以后决定切换到INNODB引擎,则会出现性能问题。