MySQL将两列合并并添加到一个新列中

MySQL将两列合并并添加到一个新列中,mysql,sql,Mysql,Sql,我的MySQL表结构如下: +----------------+----------------+----------+ | zipcode | city | state | +----------------+----------------+----------+ | 10954 | Nanuet | NY | +----------------+----------------+----------+

我的MySQL表结构如下:

+----------------+----------------+----------+
|    zipcode     |      city      |   state  |
+----------------+----------------+----------+
|     10954      |     Nanuet     |    NY    |
+----------------+----------------+----------+
我想将上述3列合并为一列,如下所示:

+---------------------+
|      combined       |
+---------------------+
| 10954 - Nanuet, NY  |
+---------------------+

我想在不破坏原始3个字段的情况下,将此组合列添加到表的末尾。

向表中添加新列并执行查询:

UPDATE tbl SET combined = CONCAT(zipcode, ' - ', city, ', ', state)

你确定要这样做吗?实际上,您是在复制三个原始列中的数据。从那时起,您需要确保组合字段中的数据与前三列中的数据匹配。这对您的应用程序来说是更大的开销,其他更新系统的进程将需要了解这种关系

如果您需要数据,为什么不在需要时选择in?用于选择该字段中的内容的SQL为:

SELECT CONCAT(zipcode, ' - ', city, ', ', state) FROM Table;
这样,如果字段中的数据发生更改,则不必更新组合字段。

创建列:

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);

选择CONCAT zipcode“-”,city“,”,state AS COMBINED FROM TABLE

我喜欢这个选项,因为它的性能优于存储。对于存储优于性能,您可以将concat添加到select查询本身。请参阅squaknull的帖子了解触发代码。我使用的是自动完成功能,我希望能够同时使用zipcode和city搜索自动完成,这似乎是唯一简单的方法。至少,以我的知识水平。请执行以下自动完成操作:从表中选择*,其中zipcode(如“%q%)或city(如“%q%)或state(如“%q%)我觉得最干净。复制数据,然后必须检查它们是否同步,并且在更高级别的代码中设置额外的逻辑来解决不同步的问题,这似乎比简单地在SELECT上连接要肮脏得多,甚至比使用应用程序来连接要糟糕得多。虽然@squawknull的答案在适当的情况下引入了一个很酷的概念,但我非常同意这个答案。如何在更新中设置两个字段,我尝试添加了另一个set new.rowname语句,但出现了一个错误。我在这里是从内存开始的,但我非常确定您可以用逗号分隔要设置的值,如:set new.foo=1,new.bar=2我想知道,如果一个字段来自不同的表,例如,城市来自表2??您可以通过触发器在子查询中查询另一个表,例如set newLearn more…combined=从foo中选择城市where。。。。但是,在触发器中跨表构建依赖关系时,应该非常小心。这可能会导致一些非常严重的锁定问题,因为对一个表的任何更新都可能需要锁定多个其他表。在大多数情况下,您可以找到更好的方法,可能是更好地规范化数据结构,或者将一些逻辑向上推到应用程序代码中,而不是向下推到数据库中。在大多数情况下,动态压缩数据似乎比创建新的列实例更为理想。请参阅MikeHeader的答案。