防止MySQL中的JSON数组重复

时间:2018-04-25 01:36:19

标签: mysql

我在MySQl表中有一个JSON类型的列。此列存储一个整数值数组,如'[1,2,3]'。

我想要的是:当我使用JSON_ARRAY_INSERT / JSON_ARRAY_APPEND将新值插入此数组时,如果该值已存在,则忽略它。

我如何在MySQL中执行此操作?也就是说,不检查调用PHP或Node.js等脚本的重复项。

更新:我更倾向于为此目的使用内置的MySQL机制,因为如果在外部脚本中完成,由于竞争条件会发生重复的可能性很小,即使我在存储之前检查重复项数据。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果不知道您的确切表结构,很难给出准确的答案,但以下查询说明了它是如何使用变量完成的。您只需根据列进行调整即可。

set @j='["1","2","3"]';
set @v = "4";
select ifnull(json_search(@j, 'one', @v), @j:=json_array_append(@j, '$', @v));
set @v = "1";
select ifnull(json_search(@j, 'one', @v), @j:=json_array_append(@j, '$', @v));
select @j;

输出:

["1", "2", "3", "4"]

答案 1 :(得分:0)

希望这会有所帮助。

模式(MySQL v5.7)

CREATE TABLE test (
  id INT,
  js JSON
);
INSERT INTO test (id, js) VALUES (1, '[1,2,3]');
INSERT INTO test (id, js) VALUES (2, '[1,2]');

查询#1

select * from test;

| id  | js        |
| --- | --------- |
| 1   | [1, 2, 3] |
| 2   | [1, 2]    |

查询#2

UPDATE test
SET js = JSON_ARRAY_APPEND (js, '$', 3)
WHERE id = 1 and not JSON_CONTAINS(js, '3', '$');

UPDATE test
SET js = JSON_ARRAY_APPEND (js, '$', 3)
WHERE id = 2 and not JSON_CONTAINS(js, '3', '$');

查询#3

select * from test;

| id  | js        |
| --- | --------- |
| 1   | [1, 2, 3] |
| 2   | [1, 2, 3] |