#mysql #sql
#mysql #sql
Вопрос:
У меня есть следующая структура с таблицей MySQL:
---------------- ---------------- ----------
| zipcode | city | state |
---------------- ---------------- ----------
| 10954 | Nanuet | NY |
---------------- ---------------- ----------
Я хочу объединить вышеупомянутые 3 столбца в один столбец следующим образом:
---------------------
| combined |
---------------------
| 10954 - Nanuet, NY |
---------------------
И я хочу добавить этот «объединенный» столбец в конец таблицы, не уничтожая исходные 3 поля.
Ответ №1:
Создайте столбец:
ALTER TABLE yourtable ADD COLUMN combined VARCHAR(50);
Обновите текущие значения:
UPDATE yourtable SET combined = CONCAT(zipcode, ' - ', city, ', ', state);
Автоматически обновлять все будущие значения:
CREATE TRIGGER insert_trigger
BEFORE INSERT ON yourtable
FOR EACH ROW
SET new.combined = CONCAT(new.zipcode, ' - ', new.city, ', ', new.state);
CREATE TRIGGER update_trigger
BEFORE UPDATE ON yourtable
FOR EACH ROW
SET new.combined = CONCAT(new.zipcode, ' - ', new.city, ', ', new.state);
Комментарии:
1. Как мне установить два поля при обновлении, я попытался добавить другой оператор set new.rowname, но просто получаю ошибку.
2. Здесь я использую память, но я почти уверен, что вы можете просто разделить значения для установки запятыми, например: set new.foo = 1, new.bar = 2
3. Мне было интересно, что, если одно поле должно поступать из другой таблицы, т. Е. город, поступающий из table2??
4. Вы можете запросить другую таблицу в подзапросе из триггера, что-то вроде
set newLearn more….combined = (select city from foo where ...)
. Однако вам следует проявлять большую осторожность при построении зависимостей между таблицами в триггерах. Это может вызвать некоторые действительно неприятные проблемы с блокировкой, поскольку любое обновление одной таблицы может потребовать блокировки нескольких других таблиц. В большинстве случаев вы можете найти лучший способ, возможно, либо лучше нормализовав структуру данных, либо перенеся часть логики в код вашего приложения, а не перенося ее в базу данных.5. В большинстве случаев кажется более оптимальным
concat
обрабатывать данные на лету, а не создавать новый экземпляр столбца. Смотрите ответ MikeTheReader.
Ответ №2:
Вы уверены, что хотите это сделать? По сути, вы дублируете данные, которые находятся в трех исходных столбцах. С этого момента вам нужно будет убедиться, что данные в объединенном поле соответствуют данным в первых трех столбцах. Это больше накладных расходов для вашего приложения, и другим процессам, которые обновляют систему, потребуется понять взаимосвязь.
Если вам нужны данные, почему бы не выбрать в, когда вам это нужно? SQL для выбора того, что будет в этом поле, будет:
SELECT CONCAT(zipcode, ' - ', city, ', ', state) FROM Table;
Таким образом, если данные в полях изменяются, вам не нужно обновлять ваше объединенное поле.
Комментарии:
1. Я использую функцию автозаполнения и хочу иметь возможность выполнять автозаполнение как по почтовому индексу, так и по городу, это кажется единственным простым способом. По крайней мере, с моим уровнем знаний.
2. Выполните автозаполнение следующим образом: ВЫБЕРИТЕ * из таблицы, где почтовый индекс ТИПА ‘%q% Или город ТИПА’%q% или штат ТИПА ‘%q%
3. По-моему, это самый чистый вариант. Дублирование данных, а затем необходимость проверять, синхронизированы ли они, и внедрение дополнительной логики для решения проблем с несинхронизацией в коде более высокого уровня кажется намного более грязным, чем простое объединение
SELECT
или, что еще лучше, использование приложения для объединения. Не могу не согласиться с этим ответом, хотя ответ @squawknull представил классную концепцию, где это уместно.
Ответ №3:
Добавьте новый столбец в свою таблицу и выполните запрос:
UPDATE tbl SET combined = CONCAT(zipcode, ' - ', city, ', ', state)
Комментарии:
1. Мне нравится этот вариант, потому что он обеспечивает производительность по сравнению с хранилищем. Для увеличения производительности хранилища вы могли бы добавить concat к самому запросу select. Код триггера см. в сообщении squaknull.
Ответ №4:
ВЫБЕРИТЕ CONCAT (почтовый индекс, ‘ — ‘, город, ‘, ‘, штат) КАК ОБЪЕДИНЕННЫЙ ИЗ ТАБЛИЦЫ