Как добавить сгенерированный столбец, который зависит самостоятельно? - PullRequest
0 голосов
/ 06 июля 2019

Я хочу добавить сгенерированный столбец, используя MYSQL, который в основном зависит от некоторых других столбцов, а также от некоторых в некоторых случаях. Возможно ли это сделать?

Также я сталкиваюсь с некоторыми ошибками при добавлении сгенерированного столбца со значением по умолчанию. Вот команда, которую я пробую:

ALTER TABLE temp
ADD COLUMN abc INT AS 
(CASE 
    WHEN cde > 95 THEN "1"
    WHEN cde < 80 THEN "0"
    WHEN (cde > 79 AND cde < 96) THEN abc
END) DEFAULT 0

Можно ли добиться чего-то подобного с помощью сгенерированного столбца?

Ответы [ 2 ]

1 голос
/ 06 июля 2019

Ах, теперь я получил то, что вы пытаетесь сделать.В случае изменения cde вы хотите изменить abc только в некоторых случаях, а в других нет.

Следовательно, это не сгенерированный столбец, который вы ищете, поскольку такой столбец зависит только от текущих полейряд. Вместо этого вам нужен триггер , который меняется или не изменяется abc в зависимости от нового значения cde.

Посмотрите документы, описывающие, как написать такой триггер: https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

В триггере BEFORE вы также можете изменить его значение с помощью SET NEW.col_name = value, если у вас есть привилегия UPDATE для него.Это означает, что вы можете использовать триггер для изменения значений, которые будут вставлены в новую строку или использованы для обновления строки.(Такой оператор SET не влияет на триггер AFTER, поскольку изменение строки уже произошло.)

1 голос
/ 06 июля 2019

Нет, вы не можете создать сгенерированную ссылку на столбец.

https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html говорит:

Определение сгенерированного столбца может ссылаться на другие сгенерированные столбцы,но только те, которые встречались ранее в определении таблицы.

Поскольку сгенерированный столбец всегда берет свое значение из выражения, ссылающегося на другие столбцы, бессмысленно давать ему предложение DEFAULT.

Чтобы сделать то, что вы описываете, вы можете сделать это следующим образом:

ALTER TABLE temp
ADD COLUMN abc INT AS 
(CASE 
    WHEN cde > 95 THEN "1"
    WHEN cde < 80 THEN "0"
    WHEN (cde > 79 AND cde < 96) THEN 0
END)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...