开发者问题收集

ON DUPLICATE KEY 无法与我的 INSERT INTO 脚本配合使用

2021-08-22
653

我有两个表。一个是 codmission_index ,另一个是 permission_index_bkp

我的脚本应该从 permission_index 转移一些行和数据 cermission_index_bkp 。但是,如果所有4列中的数据都相同,我不想创建新行。

这就是我要使用的内容:

402366179

我一直在遇到类似的错误:

1052:字段列表中的列'app'是模棱两可的 (我认为我通过在curmission_index_bkp中更改列的名称来解决此问题) 。

1054:未知列'app'在“字段列表”'

你们能告诉我如何修复我的查询?

谢谢!

编辑1:

这使错误消失了,但是,添加行在 cermission_index_bkp 中,即使它们具有相同的值:

889625703
2个回答

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

并且您需要分配给目标表中的列名称,而不是您选择的表中的名称,因此它们应该全部为 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 子句中包含唯一键列。

Barmar
2021-08-22

虽然我从未使用过这种语法,但在谷歌上搜索后,我发现您需要在 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;

输出:

表测试:

a b
1 1
1 2

表格测试2:

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

输出:

表格测试:

a b
1 1
1 2
1 3
1 1

表格测试2:

a b
1 1
1 2
1 3

db<fiddle 此处

Kazi Mohammad Ali Nur Romel
2021-08-22