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

inside file1.txt

hey1,5,6, (a1 / a2 / a3), ()
hey2,7,8, (a2 / a3 / a4 / a5) , ()

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

index1=['string1','integer1','integer2','list1','list2']
dict_main={}
with open ('file1.txt') as f:
    count=0
    for line in f:
        dict1={}
        lst1=line.strip().split(',')
        dict1[index1[0]]=lst1[0]
        dict1[index1[1]]=int(lst1[1])
        dict1[index1[2]]=int(lst1[2])
        dict1[index1[3]]=lst1[3][1:-1].strip().split('/')
        dict1[index1[4]]=[]
        count+=1
        dict_main['dict'+str(count)]=dict1
print(dict_main)

Результат

{'dict1': {'integer2': 6, 'list2': [], 'integer1': 5, 'list1': ['a1', 'a2', 'a3'], 'string1': 'hey1'}, 'dict2': {'integer2': 8, 'list2': [], 'integer1': 7, 'list1': ['a2', 'a3', 'a4', 'a5'], 'string1': 'hey2'}}
10
задан adam 11 December 2008 в 18:57
поделиться

3 ответа

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 a NULL с любой другой строкой производит a NULL. Использовать COALESCE() на каждом столбце или на сцепленной строке как соответствующая.

править: Следующие наборы в качестве примера 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
14
ответ дан 3 December 2019 в 20:44
поделиться

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

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

2
ответ дан 3 December 2019 в 20:44
поделиться

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

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

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

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

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

2
ответ дан 3 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: