Я хочу взять существующие столбцы 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;
Используйте представление или сгенерированный столбец. Не добавляйте реальный столбец, иначе вы сохраните имя избыточно и, таким образом, нарушите нормализацию базы данных (вторая форма нормализации), которая запрещает нам иметь в таблице столбцы, которые зависят друг от друга. В вашем случае вам всегда придется думать об изменении другого столбца, когда вы меняете один из столбцов имени. Если вы это забудете, у вас возникнут несоответствия данных (два разных имени в одной строке).
Возьмите за привычку не использовать двойные кавычки для строк. Двойные кавычки предназначены для разделения имен в SQL, а не строк. Вместо этого используйте одинарные кавычки: CONCAT(first_name, ' ', last_name). Или еще лучше: CONCAT_WS(' ', first_name, last_name), потому что пробел вставляется только при необходимости; если имя или фамилия имеют нулевое значение, пробел не будет добавлен.






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?
сначала вам нужно добавить столбец с 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_.
Кстати, двойные кавычки разделяют имена в SQL. Это одинарные кавычки, которые предназначены для ограничения строковых литералов. Хотя MySQL допускает двойные кавычки в этом месте, вам все равно не следует их использовать, а лучше придерживаться стандарта SQL.
Это еще один способ добавления нового столбца со значениями, полученными из других столбцов. Следующий код генерирует объединенное значение столбца 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, так как мы, вероятно, не будем его индексировать (поскольку вместо этого мы всегда можем проиндексировать имя и фамилию).
@ThorstenKettner Вычисляемый столбец может быть VIRTUAL (вместо STORED).
Вы можете изменить таблицу, добавив новый столбец с именем
Full_Name. Затем обновите новый столбец таблицы, указав объединенное значение.