修改 只是为了我想用这个设计实现的目标增加一点清晰度。数据将被插入到tbl1中,这将是用户条目。 我的目的是在tbl2中存储foo的不同可能值。这样每个可能的foo值都附有一个唯一的ID。
结束编辑
我有两个语法表:
CREATE TABLE `tbl1` (
`id` int(10) unsigned NOT NULL auto_increment,
`foo` int(10) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY(`foo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `tbl2` (
`id` int(10) unsigned NOT NULL auto_increment,
`value` varchar(100) NOT NULL default '',
PRIMARY KEY(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DELIMITER //
DROP TRIGGER `trigger1`//
CREATE TRIGGER `trigger1` BEFORE INSERT ON `tbl1`
FOR EACH ROW BEGIN
DECLARE x INT(10);
IF (SELECT COUNT(*) FROM `tbl2` WHERE `value`= NEW.foo) = 0 THEN INSERT INTO `tbl2` (`value`) VALUES (NEW.foo); SET x=last_insert_id();\
ELSE SET x=(SELECT `id` FROM `tbl2` WHERE `value`= NEW.foo);
END IF;
SET NEW.foo=x;
END//
DELIMITER ;
问题是MySQL拒绝foo的varchar值,因此插入如下:
INSERT INTO tbl1
(foo)VALUES('bar');
将记录插入tbl2,值为0。
是否有其他方法可以达到正确的结果(不将foo更改为varchar)?
答案 0 :(得分:1)
它不会起作用,因为你试图将一个字符串'bar'插入表格字段foo中,因为tbl1是int类型,并且根据this:
如果您尝试将不以数字开头的字符串存储到 数字列,MySQL服务器存储0。
因此,在执行触发器之前,值'bar'将转换为0。