Как добавить объединенный столбец в таблицу в MySQL?

Я хочу взять существующие столбцы First_Name и Last_Name и объединить их, чтобы добавить новый столбец Full_Name в таблицу «Сотрудники». (Я работаю над MySQL Workbench.)

Итак, я попробовал объединить столбцы First_Name и Last_Name, используя следующий запрос:

SELECT CONCAT(First_Name, " ", Last_Name) AS Full_Name FROM Employees;

Но это только для отображения, поэтому, если я хочу добавить этот столбец в таблицу, как мне это сделать??

Этот запрос также предназначен для отображения и фактически не включает новый столбец в таблицу:

SELECT *, concat(First_name, " ", Last_name) AS Full_Name FROM Employees;

Вы можете изменить таблицу, добавив новый столбец с именем Full_Name. Затем обновите новый столбец таблицы, указав объединенное значение.

prasad_ 23.05.2024 07:19

Используйте представление или сгенерированный столбец. Не добавляйте реальный столбец, иначе вы сохраните имя избыточно и, таким образом, нарушите нормализацию базы данных (вторая форма нормализации), которая запрещает нам иметь в таблице столбцы, которые зависят друг от друга. В вашем случае вам всегда придется думать об изменении другого столбца, когда вы меняете один из столбцов имени. Если вы это забудете, у вас возникнут несоответствия данных (два разных имени в одной строке).

Thorsten Kettner 23.05.2024 09:12

Возьмите за привычку не использовать двойные кавычки для строк. Двойные кавычки предназначены для разделения имен в SQL, а не строк. Вместо этого используйте одинарные кавычки: CONCAT(first_name, ' ', last_name). Или еще лучше: CONCAT_WS(' ', first_name, last_name), потому что пробел вставляется только при необходимости; если имя или фамилия имеют нулевое значение, пробел не будет добавлен.

Thorsten Kettner 23.05.2024 09:14
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

CREATE TABLE New_Employees (
EmployeeID INT AUTO_INCREMENT PRIMARY KEY,
First_Name VARCHAR(255),
Last_Name VARCHAR(255),
Full_Name VARCHAR(255)
);

INSERT INTO New_Employees (First_Name, Last_Name, Full_Name)
SELECT First_Name, Last_Name, CONCAT(First_Name, ' ', Last_Name) AS Full_Name
FROM Employees;

Этот запрос создает новую таблицу New_Employees со столбцами «EmployeeID», «First_Name», «Last_Name» и «Full_Name». Затем он вставляет данные из существующей таблицы «Сотрудники» в новую таблицу, причем столбец «Полное_имя» представляет собой объединение столбцов «Имя» и «Фамилия». Настройте типы и длину данных в соответствии с вашими конкретными требованиями.

Вы создали этот ответ с помощью ChatGPT?

DarkBee 23.05.2024 07:20
Ответ принят как подходящий

сначала вам нужно добавить столбец с Full_Name, затем обновить столбец Full_Name

ALTER TABLE Employees
ADD COLUMN Full_Name VARCHAR(100);

UPDATE Employees 
SET Full_Name = CONCAT(First_Name, " ", Last_Name);

Именно так не надо делать. Это нарушает нормализацию базы данных (2NF), поскольку столбцы имен зависят друг от друга, что может привести к несогласованности данных. Как поступить со строкой, содержащей, например, «Сью», «Миллер», «Джон Смит»? Какое имя правильное, какое неправильное? Вместо этого мы либо создадим представление для генерации полного имени, либо вычисляемых столбцов, как показано в ответе prasad_.

Thorsten Kettner 23.05.2024 08:46

Кстати, двойные кавычки разделяют имена в SQL. Это одинарные кавычки, которые предназначены для ограничения строковых литералов. Хотя MySQL допускает двойные кавычки в этом месте, вам все равно не следует их использовать, а лучше придерживаться стандарта SQL.

Thorsten Kettner 23.05.2024 08:48

Это еще один способ добавления нового столбца со значениями, полученными из других столбцов. Следующий код генерирует объединенное значение столбца Full_Name и сохраняет его.

ALTER TABLE Employees 
  ADD COLUMN Full_Name VARCHAR(25) 
    GENERATED ALWAYS AS (CONCAT_WS(" ", First_Name, Last_Name)) STORED;

INSERT INTO 
  Employees (First_Name, Last_Name)
    VALUES ("John", "Doe");

SELECT First_Name, Last_Name, Full_Name FROM Employees;

+------------+-----------+-----------+
| First_Name | Last_Name | Full_Name |
+------------+-----------+-----------+
| John       | Doe       | John Doe  |
+------------+-----------+-----------+

Примечание. Приведенное выше ALTER TABLE также обновляет значения столбцов Full_Name для существующих строк с помощью производных значений.

Ссылка: MySQL 8 — ALTER TABLE и сгенерированные столбцы

Это (или представление) — правильный путь. Однако я бы использовал здесь CONCAT_WS в том случае, если first_name или Last_name могут быть нулевыми, и тогда нам не хотелось бы добавлять пробел. И я не думаю, что обязательно делать этот вычисляемый столбец STORED, так как мы, вероятно, не будем его индексировать (поскольку вместо этого мы всегда можем проиндексировать имя и фамилию).

Thorsten Kettner 23.05.2024 08:51

@ThorstenKettner Вычисляемый столбец может быть VIRTUAL (вместо STORED).

prasad_ 23.05.2024 09:21

Другие вопросы по теме