mysql – 创建触发器,根据枚举值插入行?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 创建触发器,根据枚举值插入行?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2887字,纯文字阅读大概需要5分钟。
内容图文
![mysql – 创建触发器,根据枚举值插入行?](/upload/InfoBanner/zyjiaocheng/896/62ef717c040c420fa930da652be23b55.jpg)
我对触发器很新,我遇到了一般问题.我想实现这个目标:
CREATE TABLE `searcharticles` (
`articleID` int(11) unsigned NOT NULL,
`ean` char(13) COLLATE utf8_unicode_ci DEFAULT NULL,
`manufacturerNumber` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`articleID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `addresses` (
`articleID` int(11) unsigned NOT NULL,
`shop` enum('shop1','shop2') COLLATE utf8_unicode_ci NOT NULL,
`url` varchar(255) COLLATE utf8_unicode_ci NULL,
`status` tinyint(3) NOT NULL DEFAULT '0',
`createTime` datetime NOT NULL,
`updateTime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`articleID`,`shop`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
当在searcharticle中插入新行时,应填充表地址,但不仅要填充一次.我想为enum商店里的每一家商店做一个记录(我知道这个设计不是很好).我坚持这个:
CREATE TRIGGER ins_addresses AFTER INSERT on searcharticles
FOR EACH ROW
BEGIN
INSERT INTO addresses(articleID, shop, createtime) VALUES(NEW.articleID, ?, CURRENT_TIMESTAMP);
END
我怎么能遍历可能的枚举值来触发插入’shop1’而另一个插入’shop2’而不在插入中写入可能的商店名称?
解决方法:
它不漂亮,但是它从INFORMATION_SCHEMA.COLUMNS获取可能的枚举值.
DELIMITER $$
DROP TRIGGER ins_addresses $$
CREATE TRIGGER ins_addresses AFTER INSERT on searcharticles
FOR EACH ROW
BEGIN
DECLARE column_list char(200);
DECLARE current_value char(200);
DECLARE counter INT DEFAULT 0;
DECLARE num_enums INT;
/* Format goes from "enum('shop1','shop2')" to "shop1,shop2" */
SELECT REPLACE(SUBSTR(COLUMN_TYPE,6,LENGTH(COLUMN_TYPE)-6),'''','')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'stackex'
AND TABLE_NAME = 'addresses'
AND COLUMN_NAME = 'shop'
INTO column_list;
SET num_enums = LENGTH(column_list)- LENGTH(REPLACE(column_list, ',', ''))+1;
WHILE counter < num_enums DO
SET current_value = (SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(column_list, ',', counter+1),
LENGTH(SUBSTRING_INDEX(column_list, ',', counter )) + 1), ',', ''));
INSERT INTO addresses(articleID, shop, createtime)
VALUES (NEW.articleID, current_value, CURRENT_TIMESTAMP);
SET counter = counter + 1;
END WHILE;
END$$
DELIMITER ;
测试:
mysql> use stackex;
Database changed
mysql> insert into searcharticles values ( 1, 'foo','bar' );
Query OK, 1 row affected (0.00 sec)
mysql> select * from addresses;
+-----------+-------+------+--------+---------------------+------------+
| articleID | shop | url | status | createTime | updateTime |
+-----------+-------+------+--------+---------------------+------------+
| 1 | shop1 | NULL | 0 | 2012-08-17 09:32:33 | NULL |
| 1 | shop2 | NULL | 0 | 2012-08-17 09:32:33 | NULL |
+-----------+-------+------+--------+---------------------+------------+
2 rows in set (0.00 sec)
mysql>
我真的很讨厌回答这个问题!更改数据模型以使用查找表,商店.
如果商店枚举名称中包含逗号或引号(可能),它将会非常可怕.
内容总结
以上是互联网集市为您收集整理的mysql – 创建触发器,根据枚举值插入行?全部内容,希望文章能够帮你解决mysql – 创建触发器,根据枚举值插入行?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。