Итак, у меня есть таблица примерно следующим образом:MySQL Insert/Update Триггер с AUTO_INCREMENT
CREATE TABLE CUSTOMER (
CUSTID INT NOT NULL AUTO_INCREMENT,
NAME CHAR (45),
CONSTRAINT CUSTOMER_PRIMARY_KEY PRIMARY KEY (CUSTID))
AUTO_INCREMENT = 100;
Я авто приращением CUSTID
так что можно просто вставить имя и он создан следующий доступный CUSTID
. Тем не менее, я также хочу, чтобы убедиться, что это не представляется возможным установить значение CUSTID
нулю, либо о создании строки или на обновление, так что я построил следующий триггер:
DELIMITER $$
CREATE TRIGGER `custid_before_insert` BEFORE INSERT ON `CUSTOMER`
FOR EACH ROW
BEGIN
IF (NEW.CUSTID) <= 0 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT = 'Check constraint on CUSTOMER.CUSTID failed';
END IF;
END$$
CREATE TRIGGER `custid_before_update` BEFORE UPDATE ON `CUSTOMER`
FOR EACH ROW
BEGIN
IF (NEW.CUSTID) <= 0 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT = 'Check constraint on CUSTOMER.CUSTID failed';
END IF;
END$$
DELIMITER ;
К сожалению, в мой блаженный незнание того, как работал AUTO_INCREMENT
, я пришел к выводу, что это неправильный путь. Попытка вставить клиента без значения CUSTID
- это отключение триггера, что приводит к сбою вставки, которое, как я полагаю, связано с тем, что значение равно нулю перед вставкой, когда AUTO_INCREMENT
присваивает ему значение.
Будет ли лучший способ сделать это, действительно, изменить триггер, чтобы произойти после вставки и удаления строки, или есть лучший способ сделать это, чтобы просто выбросить ошибку?
Обычно для этого используется ограничение CHECK, например 'CHECK (custid> 0)' but ... "* Предложение CHECK анализируется, но игнорируется всеми механизмами хранения. *" Если нет особых причин для бизнеса идентификатор не может быть 0, нет причины целостности данных, чтобы запретить его. – Schwern
Должен любить MySQL, да? К сожалению, моя спецификация заключается в том, что идентификатор никогда не может быть ниже 1. Первоначальные Postgres, которые я переношу, фактически используют проверку точно так же, как вы предложили, которая работает нормально, но я изо всех сил пытаюсь сделать то же самое с MySQL. – Jamie4840