2

我有两张桌子。一个是permission_index,另一个是permission_index_bkp

我的脚本应该将一些行和数据从 传输permission_indexpermission_index_bkp. 但是,如果所有 4 列中的数据都相同,我不想创建新行。

这就是我想要使用的:

INSERT INTO permission_index_bkp
  (b_app, b_perm_type, b_perm_type_id, b_perm_3)
  SELECT app, perm_type, perm_type_id, perm_3
    FROM permission_index
   WHERE app = 'module'
     AND perm_type = '1'
     AND perm_type_id = '2'
     AND perm_3 IS NOT NULL 
      ON DUPLICATE KEY UPDATE app = app,
                              perm_type = perm_type, 
                              perm_type_id = perm_type_id,
                              perm_3 = perm_3;

我一直收到如下错误:

1052:字段列表中的列“app”不明确(我想我通过更改permission_index_bkp 中的列名解决了这个问题)。

或者

1054:“字段列表”中的未知列“应用程序”

你们能告诉我如何解决我的查询吗?

谢谢!!

编辑1:

permission_index_bkp这使错误消失了,但是,即使它们具有相同的值,也会不断添加行:

INSERT INTO permission_index_bkp
  (b_app, b_perm_type, b_perm_type_id, b_perm_3)
  SELECT app, perm_type, perm_type_id, perm_3
    FROM permission_index AS pi
   WHERE app = 'module'
     AND perm_type = '1'
     AND perm_type_id = '2'
     AND perm_3 IS NOT NULL 
      ON DUPLICATE KEY UPDATE b_app = b_app,
                              b_perm_type = b_perm_type, 
                              b_perm_type_id = b_perm_type_id,
                              b_perm_3 = b_perm_3;
4

2 回答 2

3

VALUES()在子句中使用ON DUPLICATE KEY以指定要将列更新为将插入的值。

并且您需要分配给目标表中的列名,而不是您从中选择的表中的名称,所以它们都应该是b_XXX.

INSERT INTO permission_index_bkp
  (b_app, b_perm_type, b_perm_type_id, b_perm_3)
  SELECT app, perm_type, perm_type_id, perm_3
    FROM permission_index
   WHERE app = 'module'
     AND perm_type = '1'
     AND perm_type_id = '2'
     AND perm_3 IS NOT NULL 
ON DUPLICATE KEY UPDATE 
    b_app = VALUES(b_app),
    b_perm_type = VALUES(b_perm_type), 
    b_perm_type_id = VALUES(b_perm_type_id),
    b_perm_3 = VALUES(b_perm_3);

此外,您不需要在ON DUPLICATE KEY UPDATE子句中包含唯一键列。

于 2021-08-22T05:32:24.483 回答
2

虽然我从未使用过这种语法,但在 google 中进行了一些搜索后,我发现您需要在permission_index表的所有四列上声明一个唯一键以删除重复条目。

请检查以下示例:

 create table test (a int, b int);
 insert into test values(1,1);
 insert into test values(1,2);

 create table test2 (a int, b int,
 UNIQUE KEY uktest2 (a,b));

 INSERT INTO test2
   (a,b)
   SELECT a,b
     FROM test b
    WHERE a=1
       ON DUPLICATE KEY UPDATE a = b.a,
                               b=b.b;


 select * from test;
 select * from test2;

输出:

表测试:

一个 b
1 1
1 2

表测试2:

一个 b
1 1
1 2
 insert into test values(1,3);
 insert into test values(1,1);


 INSERT INTO test2
   (a,b)
   SELECT a,b
     FROM test b
    WHERE a=1
       ON DUPLICATE KEY UPDATE a = b.a,
                               b=b.b;


 select * from test;
 select * from test2;

输出:

表测试:

一个 b
1 1
1 2
1 3
1 1

表测试2:

一个 b
1 1
1 2
1 3

db<小提琴在这里

于 2021-08-22T05:28:17.770 回答