Триггер MySQL для обновления поля к значению идентификатора

Другие недогруженные операторы checked и unchecked:

short x = 32767;   // 32767 is the max value for short
short y = 32767;
int z1 =  checked((short)(x + y));   //will throw an OverflowException
int z2 =  unchecked((short)(x + y)); // will return -2
int z3 =  (short)(x + y);            // will return -2
17
задан szeryf 11 August 2009 в 09:15
поделиться

3 ответа

Я не знаю, как сделать это в одном операторе, даже используя триггер.

Решение триггера, предложенное @Lucky, в MySQL выглядело бы так:

CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
  SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END

Однако есть проблема. На этапе BEFORE INSERT автоматически сгенерированное значение id не было создано. Поэтому, если group_id имеет значение null, по умолчанию используется NEW.id , который всегда равен 0.

Но если вы измените этот триггер на срабатывание во время AFTER INSERT фазы, поэтому у вас есть доступ к сгенерированному значению NEW.id , вы не можете изменять значения столбца.

MySQL не поддерживает выражения для DEFAULT столбца , поэтому вы также не можете объявить это поведение в определении таблицы.

Единственное решение - выполнить INSERT , а затем немедленно выполнить UPDATE , чтобы изменить group_id , если он не установлен.

INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();
29
ответ дан 30 November 2019 в 13:28
поделиться

Я считаю, что это сработает для вас

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

test_b: a_id, value
test_c: a_id, value

А вот триггер на вставке теста b. Он проверяет, имеет ли a_id значение null, и если это так, вставляет 0

CREATE TRIGGER test_b AFTER INSERT ON test_b
  FOR EACH ROW 
    INSERT INTO test_c (a_id, value) VALUES (IFNULL(NEW.a_id, 0),NEW.value)
0
ответ дан 30 November 2019 в 13:28
поделиться

Этот триггер должен выполнять то, что вы просили.

   CREATE TRIGGER mytrigger BEFORE INSERT ON mytable
          IF new.group_id IS NULL
            SET new.group_id = new.id
          END IF
      END;

Он скопирован из очень похожего примера на странице документации MYSQL .

-3
ответ дан 30 November 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: