Вставьте триггер для строки внешнего ключа в int - PullRequest
0 голосов
/ 30 июля 2011

EDIT Просто чтобы добавить немного ясности к тому, чего я пытаюсь достичь с помощью этого дизайна. Данные будут вставлены в таблицу tbl1, которая будет входом пользователя. Мое намерение состоит в том, чтобы хранить различные возможные значения для foo в tbl2. Таким образом, к каждому возможному значению foo присваивается уникальный идентификатор.

КОНЕЦ РЕДАКТИРОВАНИЯ

У меня есть две таблицы с синтаксисом:

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 отклоняет значение varchar для foo и, следовательно, вставку следующим образом: INSERT INTO tbl1 (foo) VALUES ('bar'); Вставит запись в tbl2 со значением 0.

Существуют ли другие подходы к этому, которые могут достичь правильного результата (без изменения foo на varchar)?

1 Ответ

1 голос
/ 30 июля 2011

Это не сработает, потому что вы пытаетесь вставить строку 'bar' в поле таблицы foo для tbl1, имеющего тип int, и в соответствии с this :

Если вы попытаетесь сохранить строку, которая не начинается с числа, в числовой столбец, MySQL Server хранит 0.

Таким образом, перед запуском триггера значение bar преобразуется в 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...