Как ясно указывает на сообщение об ошибке «значение по умолчанию столбца [GUARANTEED_YIELD] не является константой», вы не можете использовать переменные в выражении по умолчанию.
Один из способов добиться того, чего вы хотите, - это сделать послетриггер вставки, который обновляет столбец, когда он был вставлен как нулевойЭто, однако, требует, чтобы столбец не был объявлен не пустым, иначе INSERT
завершится ошибкой.Так что вам придется проверить это и в триггере перед обновлением.
CREATE TABLE contract
(id integer PRIMARY KEY
AUTOINCREMENT,
insurance_pct integer
NOT NULL
DEFAULT 0,
historical_yield integer
NOT NULL
DEFAULT 0,
guaranteed_yield integer
NULL
DEFAULT NULL);
CREATE TRIGGER contract_ai
AFTER INSERT
ON contract
FOR EACH ROW
WHEN (new.guaranteed_yield IS NULL)
BEGIN
UPDATE contract
SET guaranteed_yield = insurance_pct / 100 * historical_yield
WHERE id = new.id;
END;
CREATE TRIGGER contract_bu
BEFORE UPDATE
ON contract
FOR EACH ROW
WHEN (new.guaranteed_yield IS NULL)
BEGIN
SELECT raise(FAIL, 'NOT NULL constraint failed: contract.guaranteed_yield');
END;
Еще одна вещь, которую я заметил: guaranteed_yield
- это целое число, но ваше выражение по умолчанию, скорее всего, дает нецелые значения.Вы можете потерять что-то из-за необходимого округления.Я не уверен, является ли это преднамеренным.
Приложение:
Глядя на комментарии к вашему вопросу, я не уверен, хотите ли вы просто использовать значение по умолчанию - то есть значениеиз guaranteed_yield
должно иметь значение выражения, если никакое другое значение явно не задано в INSERT
, но для него возможно иметь другие (не нулевые) значения либо из INSERT
, либо из последующего UPDATE
- или если вы хотите, чтобы это был вычисляемый столбец, он всегда имеет значение, которое дает выражение.В последнем случае: я второй комментаторов.Это потенциально опасная вещь в отношении несоответствий.Желательно использовать выражение в ваших запросах или создать представление.