Другие недогруженные операторы 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
Я не знаю, как сделать это в одном операторе, даже используя триггер.
Решение триггера, предложенное @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();
Я считаю, что это сработает для вас
У меня есть две таблицы
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)
Этот триггер должен выполнять то, что вы просили.
CREATE TRIGGER mytrigger BEFORE INSERT ON mytable
IF new.group_id IS NULL
SET new.group_id = new.id
END IF
END;
Он скопирован из очень похожего примера на странице документации MYSQL .