将外键字符串的触发器插入int

时间:2011-07-30 18:36:15

标签: mysql triggers

修改 只是为了我想用这个设计实现的目标增加一点清晰度。数据将被插入到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)?

1 个答案:

答案 0 :(得分:1)

它不会起作用,因为你试图将一个字符串'bar'插入表格字段foo中,因为tbl1是int类型,并且根据this

  

如果您尝试将不以数字开头的字符串存储到   数字列,MySQL服务器存储0。

因此,在执行触发器之前,值'bar'将转换为0。