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,MAGICID
是FOREIGN KEY
与TABLE与[=18=的PK ] , PERSONREF
是带有 VARCHAR(8)
的普通列
对我来说,重复行是指 MAGICID
和 PERSONREF
相同
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 :)
你能帮帮我吗?
在复合 (MAGICID, PERSONREF)
:
上创建一个 UNIQUE
约束
ALTER TABLE myTable ADD UNIQUE (MAGICID, PERSONREF);
使用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 的组合是唯一的
我有一个 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,MAGICID
是FOREIGN KEY
与TABLE与[=18=的PK ] , PERSONREF
是带有 VARCHAR(8)
对我来说,重复行是指 MAGICID
和 PERSONREF
相同
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 :)
你能帮帮我吗?
在复合
上创建一个(MAGICID, PERSONREF)
:UNIQUE
约束ALTER TABLE myTable ADD UNIQUE (MAGICID, PERSONREF);
使用
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 的组合是唯一的