Ответ 1
Комментарии в документации mysql о триггерах свидетельствуют о том, что в mysql такой функции нет. Лучшее, что вы можете сделать, это создать отдельную таблицу для ваших ошибок запуска, как предложено на той же странице.
У меня есть таблица, содержащая url и строку, представляющую ее параметры. Проблема в том, что я хочу, чтобы url и параметр string были единственным ограничением для таблицы - иначе никакие записи не могут иметь одну и ту же строку параметра url AND. Строка параметров может быть произвольной длины (длиннее 800 байтов или около того, что является максимальной длиной для ключа MySql, поэтому я не могу использовать Unique (url, params), поскольку он выдает ошибку...).
Я думал об использовании триггеров для этого, но как я могу сделать исключение/поднять ошибку, если триггер обнаруживает, что вставка вот-вот вставит дубликат? Я предполагаю, что я хотел бы, чтобы MySqlException, созданный как MySql, с дублирующими первичными ключами и т.д., Чтобы я мог поймать его в своем коде на С#.
У меня есть два куска в триггере Мне нужно получить помощь: ... Исключить исключение из С#... Как мне сделать исключение и т.д. На С#? ... Разрешить вставку... - как мне разрешить вставку, если нет дублирующейся записи?
Вот код запуска:
CREATE TRIGGER urls_check_duplicates
BEFORE INSERT ON urls
FOR EACH ROW
BEGIN
DECLARE num_rows INTEGER;
SELECT COUNT(*)
INTO num_rows
FROM urls
WHERE url = NEW.url AND params = NEW.params;
IF num_rows > 0 THEN
... ABORT/throw exception to C# ...
ELSE
... Allow insert ...
END
Комментарии в документации mysql о триггерах свидетельствуют о том, что в mysql такой функции нет. Лучшее, что вы можете сделать, это создать отдельную таблицу для ваших ошибок запуска, как предложено на той же странице.
Я столкнулся с этим, и хотя решение работает, я позже натолкнулся на то, что мне кажется лучшим решением. Я подозреваю, что это не вариант, когда на этот вопрос был дан ответ.
CREATE TRIGGER `TestTable_SomeTrigger`
BEFORE UPDATE ON `test_table`
FOR EACH ROW
BEGIN
DECLARE msg VARCHAR(255);
IF (SomeTestToFail = "FAIL!") THEN
set msg = "DIE: You broke the rules... I will now Smite you, hold still...";
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
-- Do any other code here you may want to occur if it all OK or leave blank it will be
-- skipped if the above if is true
END$$
Теперь будет возвращено сообщение об ошибке (или злом!), которое вы можете захватить. Для получения дополнительной информации об этом см.: http://dev.mysql.com/doc/refman/5.5/en/signal.html
Я надеюсь, что это поможет кому-то еще!
Если ваше определение таблицы имеет значение NOT NULL, вы можете установить NEW в NULL, что эффективно не будет делать вставку. Возможно, вам придется включить строгий режим sql для правильной работы.