我有一个相当简单的基本表,我将使用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
答案 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引擎,则会出现性能问题。