如何使用SQL向数组类型字段追加数据而非覆盖原有内容?
如何向数组字段追加元素而不覆盖原有内容
这个问题很常见,普通的UPDATE直接赋值会覆盖原有数组,我们需要利用数据库提供的数组拼接函数来实现追加操作,不同数据库的实现方式略有不同,下面分几种主流数据库来说明:
PostgreSQL(原生支持数组类型)
PostgreSQL对数组的操作非常友好,你可以直接用**数组拼接运算符||**来把原有数组和新元素组成的数组拼在一起,这样就能实现追加:
UPDATE your_table SET id = id || ARRAY[5, 6] WHERE no = 4;
如果是只追加单个元素,也可以用array_append函数,比如array_append(id, 5),但这里要追加多个元素,用||运算符更高效直接。
MySQL(JSON数组类型)
如果你的id字段是MySQL的JSON数组类型(推荐用这种方式存储数组),可以用JSON_ARRAY_APPEND函数来逐个追加元素,或者用JSON_MERGE_PRESERVE直接合并两个数组:
方式1:用JSON_ARRAY_APPEND追加多个元素
UPDATE your_table SET id = JSON_ARRAY_APPEND(id, '$', 5, '$', 6) WHERE no = 4;
这里的'$'表示要操作的是整个JSON数组,后面跟着要追加的每个元素。
方式2:用JSON_MERGE_PRESERVE合并数组
UPDATE your_table SET id = JSON_MERGE_PRESERVE(id, '[5, 6]') WHERE no = 4;
注意第二个参数要传入合法的JSON字符串格式的数组。
如果你的id是用逗号分隔的字符串模拟的数组(不推荐这种存储方式,查询和维护都很麻烦),可以用字符串拼接的方式实现:
UPDATE your_table SET id = CONCAT(IF(id IS NULL OR id = '', '', CONCAT(id, ',')), '5,6') WHERE no = 4;
这个写法还处理了原有字段为空的情况,避免出现开头带逗号的问题。
其他数据库(比如SQL Server)
SQL Server里如果用NVARCHAR存储逗号分隔的数组,思路和MySQL的字符串拼接类似;如果用JSON类型,也是用JSON相关函数,比如JSON_MODIFY来追加元素:
UPDATE your_table SET id = JSON_MODIFY(id, 'append $', 5) WHERE no = 4;
如果要追加多个元素,需要多次调用JSON_MODIFY,或者先构造好新数组再合并。
总之,核心思路就是不直接覆盖原有字段值,而是将原有数组与新元素/新数组进行拼接后再赋值,具体用什么函数取决于你使用的数据库类型。
内容的提问来源于stack exchange,提问作者raj




