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