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

时间:2015-04-23 17:37:53

标签: mysql duplicates

我有一个表格,我想插入新的行,如

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

ID中有INT(10)的PK,MAGICIDFOREIGN KEYINT(10)的另一个表,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 :)
你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

  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
    ;
    
  3. sqlfiddle上查看。

答案 1 :(得分:1)

对于这个例子,你给了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')

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