MySQL - установить значение по умолчанию для поля как функцию конкатенации строк - PullRequest
10 голосов
/ 11 декабря 2008

У меня есть таблица, которая немного похожа на этих актеров (имя, фамилия, имя_стадии);

Я хочу обновить stage_name, чтобы иметь значение по умолчанию

forename." ".surname

Так что

insert into actors(forename, surname) values ('Stack', 'Overflow');

выдаст запись

'Stack'     'Overflow'    'Stack Overflow'

Возможно ли это?

Спасибо:)

Ответы [ 3 ]

14 голосов
/ 11 декабря 2008

MySQL не поддерживает вычисляемые столбцы или выражения в опции DEFAULT определения столбца.

Вы можете сделать это в триггере (требуется MySQL 5.0 или выше):

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors
FOR EACH ROW
BEGIN
  SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname);
END

Вы также можете создать аналогичный триггер BEFORE UPDATE.

Следите за NULL в имени и фамилии, потому что конкат NULL с любой другой строкой выдает NULL. Используйте COALESCE() для каждого столбца или соответствующей строки.

edit: Следующий пример устанавливает stage_name, только если это NULL. В противном случае вы можете указать stage_name в вашем операторе INSERT, и он будет сохранен.

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors
FOR EACH ROW
BEGIN
  IF (NEW.stage_name IS NULL) THEN
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname);
  END IF;
END
2 голосов
/ 11 декабря 2008

Моя первая мысль: если у вас есть два значения в других полях, какова настоятельная необходимость избыточного хранения их в третьем поле? Это бросает вызов нормализации и эффективности.

Если вы просто хотите сохранить объединенное значение, то вы можете просто создать представление (или IMSNHO даже лучше хранимую процедуру), которое объединяет значения в псевдо actor поле и выполняет чтение из представления / спрока вместо стол напрямую.

Если вам абсолютно необходимо хранить объединенное значение, вы можете обработать это двумя способами:

1) Используйте хранимую процедуру для вставки вместо прямого SQL. Таким образом, вы можете получить значения и создать значение для поля, которое вы хотите заполнить, а затем создать оператор вставки, включающий объединенное значение для поля актеров.

2) Так что я не рисую слишком много пламени, отнеситесь к этому предложению в детских перчатках. Используйте только в крайнем случае. Вы можете взломать это поведение, добавив триггер для создания значения, если оно не определено. Как правило, триггеры не очень хороши. Они добавляют невидимую стоимость и взаимодействия к довольно простым взаимодействиям. Вы можете, однако, использовать CREATE TRIGGER, чтобы обновить поле актеров после вставки или обновления записи. Здесь является справочной страницей.

2 голосов
/ 11 декабря 2008

Согласно 10.1.4. Тип данных Значения по умолчанию нет, вы не можете этого сделать. Вы можете использовать только константу или CURRENT_TIMESTAMP.

OTOH, если вы достаточно современны, вы могли бы использовать триггер , чтобы выполнить то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...