MySQL 插入新行并忽略现有行,基于许多列

MySQL insert new rows and ignore existing rows, based in many columns

我有一个 table,我想在其中插入新行,例如

ID   |  MAGICID |  PERSONREF |  DATA
1    |        1 |    0000010 |  any trash data
2    |        1 |    0000011 |  any trash data
3    |        1 |    0000012 |  any trash data
4    |        1 |    0000013 |  any trash data
5    |        2 |    0000010 |  any trash data
6    |        2 |    0000011 |  any trash data
7    |        2 |    0000012 |  any trash data
8    |        2 |    0000013 |  any trash data
9    |        3 |    0000010 |  any trash data
10   |        3 |    0000011 |  any trash data
11   |        3 |    0000012 |  any trash data
12   |        3 |    0000013 |  any trash data

在table中ID是与INT(10)的PK,MAGICIDFOREIGN KEY与TABLE与[=18=的PK ] , PERSONREF 是带有 VARCHAR(8)

的普通列

对我来说,重复行是指 MAGICIDPERSONREF 相同

ID   |  MAGICID |  PERSONREF |  DATA   ---Table without duplicates, is OK
1    |        1 |    0000010 |  any trash data
2    |        1 |    0000011 |  any trash data

_

ID   |  MAGICID |  PERSONREF |  DATA   ---Table with duplicates, is bad
1    |        1 |    0000010 |  any trash data
2    |        1 |    0000010 |  any trash data

插入应该像这样工作

-- table before insert
ID   |  MAGICID |  PERSONREF |  DATA
1    |        1 |    0000010 |  any trash data
2    |        1 |    0000011 |  any trash data
3    |        1 |    0000012 |  any trash data
4    |        2 |    0000015 |  any trash data

插页

INSERT .... (1 , '0000010' ,'trash')
INSERT .... (1 , '0000011' ,'trash')
INSERT .... (1 , '0000012' ,'trash')
INSERT .... (1 , '0000015' ,'trash')
INSERT .... (1 , '0000016' ,'trash') -- in each procces MAGIC is the same for all inserts

看完后...

ID   |  MAGICID |  PERSONREF |  DATA
1    |        1 |    0000010 |  any trash data
2    |        1 |    0000011 |  any trash data
3    |        1 |    0000012 |  any trash data
4    |        2 |    0000015 |  any trash data
41   |        1 |    0000015 |  trash --beacuse is new for this MAGICID ,ID is simulated :)
42   |        1 |    0000016 |  trash --beacuse is new for this MAGICID, ID is simulated :)

你能帮帮我吗?

  1. 在复合 (MAGICID, PERSONREF):

    上创建一个 UNIQUE 约束
    ALTER TABLE myTable ADD UNIQUE (MAGICID, PERSONREF);
    
  2. 使用INSERT ... ON DUPLICATE KEY UPDATE:

    INSERT INTO myTable
      (MAGICID, PERSONREF, DATA)
    VALUES
      (1, '0000010', 'trash'),
      (1, '0000011', 'trash'),
      (1, '0000012', 'trash'),
      (1, '0000015', 'trash'),
      (1, '0000016', 'trash')
    ON DUPLICATE KEY UPDATE
      DATA = DATA
    ;
    

sqlfiddle 上查看。

对于这个例子,你给了,INSERT .... (1 , '0000010' ,'trash'),你必须做这样的事情:

INSERT INTO your_table (MAGICID , PERSONREF, DATA) 
SELECT 1, '0000010', 'trash' FROM DUAL 
WHERE NOT EXISTS(SELECT ID
                FROM you_table
                WHERE MAGICID = 1 AND PERSONREF = '0000010')

这基本上会插入 1,'0000010','trash' 如果 MAGICID 和 PERSONREF 的组合是唯一的