0lorin
@0lorin
программист

Как (и можно ли) добавить в таблицу поля с вычисляемыми именами на голом MySQL?

Да не просто с вычисляемыми, а на основе данных из других таблиц.
Есть таблица languages:
id name
1 Русский
2 English

И есть таблица, скажем, countries:
id gid
1 russia
2 france

Нужно в таблицу countries добавить ещё два поля для хранения названий на соответствующих языках:
id gid name_1 name_2
1 russia
2 france


Это реально на чистом MySQL?
  • Вопрос задан
  • 4101 просмотр
Решения вопроса 1
syschel
@syschel
freelance/python/django/backend
copist: Не очень понятно, что конкретно должно быть в колонках name_1 name_2

0lorin: В будущем — названия стран на языках из первой таблицы.

То есть при появлении новой записи в languages, в таблице countries добавить поле равное `name_` + languages.id?
Отвечу, что нельзя голым майскулом. :-)
Потому что автосоздание вы можете по вешать по сути только на тригер. А он не дружит со склейкой имён полей из переменных(CONCAT). Сам с этим воевал. Пробовал даже создать функцию, которая бы обращалась к полю, имя которого должно собираться из составных частей. Но триггеры послали меня в лес, сказав что «хитрый какой, мы видим что ты в функции создаёшь поле из переменных».
Ни создать, ни даже обратиться к такому полю.
Если же создание поля будет у вас выполнять php, а не MySQL, то там вариант niko83 вам подойдёт.

Но я бы всё таки сделал как советует boodda. С годами пришёл именно к такому варианту. Особенно когда начал использовать ОРМ джанги. Просто на HL проекте не стоит всё завязывать на MySQL. Многие вещи, особенно если это списки. Порой проще вытаскивать из БД и перебирать уже кодом. Ну и для обработки больших списков помогают такие вещи как MongoDB или noSQL
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@niko83
Попробуйте подход как тут forums.mysql.com
(пример из страницы по ссылке)

set @addcoltext = concat('ALTER TABLE nick.mytable ADD COLUMN ',concat('day',dayofmonth(curdate() - interval 1 day)),' INTEGER UNSIGNED;');
prepare addcol from @addcoltext;
execute addcol;
deallocate prepare addcol; 
Ответ написан
ivnik
@ivnik
Может получится решить проблему с помощью view?
Ответ написан
@boodda
А вам это действительно надо?
Возможно вы подошли в решению задачи не с того боку?
Я к тому что, возможно, вам проще сделать третью таблицу, в которой хранить

country.id | language.id | name

?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы