MySQL - установить значение по умолчанию для поля в качестве функции конкатенации строк

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

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

forename." ".surname

Итак,

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

создаст запись

'Stack'     'Overflow'    'Stack Overflow'

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

Спасибо:)

Ответ 1

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 в имени и фамилии, потому что concat 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

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

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

Ответ 3

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

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

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

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

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

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html