Mysql批量插入或更新,如果id为null则插入,否则更新

时间:2018-01-24 11:13:48

标签: mysql

说我有桌子:

CREATE TABLE texts
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    body TEXT
);

我想更新几个ID,并插入一些新ID。如果id为null,我想插入,否则,我想更新。所以我想要这样的东西:

INSERT INTO OR UPDATE 
  texts (id, body)
VALUES
  (NULL, 'create new row'),
  (NULL, 'create other new row'),
  (1, 'update id 1'),
  (2, 'update id 2'),
  (3, 'update id 3');

如果匹配的id不存在,我想忽略更新,因为在此期间该行显然被删除了。

4 个答案:

答案 0 :(得分:2)

有一条声明INSERT ... ON DUPLICATE KEY UPDATE

INSERT INTO texts (id, body) VALUES(1, "body text") ON DUPLICATE KEY UPDATE    
body="body text"

如果你想跳过表中不存在的ID,也许你可以试试这个

INSERT INTO
  texts (id, body)
VALUES
  (NULL, 'create new row'),
  (NULL, 'create other new row');

UPDATE texts SET
`body` = CASE 
WHEN `id` = 1 THEN 'update id 1'
WHEN `id` = 2 THEN 'update id 2'
WHEN `id` = 3 THEN 'update id 3'
ELSE `body` END

WHERE `id`=1 OR `id`=2 OR `id`=3;

答案 1 :(得分:1)

试试这个:

INSERT INTO texts(id, body) VALUES(1, "20") ON DUPLICATE KEY UPDATE body=20

答案 2 :(得分:1)

如果执行两个查询不是问题,您可以单独更新和插入。首先,UPDATE查询:

UPDATE my_table SET field1 = 
  (CASE id 
     WHEN 1 THEN 'value1'
     WHEN 2 THEN 'value2'
     WHEN 3 THEN 'value3'
  END),
  field2 = 
  (CASE id 
     WHEN 1 THEN 'value4'
     WHEN 2 THEN 'value5'
     WHEN 3 THEN 'value6'
  END)
WHERE id IN(1,2,3)

在插入侧

INSERT INTO my_table(id, field1, field2) VALUES
  (NULL, 'value7', 'value8'),
  (NULL, 'value9', 'value10'),
  (NULL, 'value11', 'value12')
;

这会导致类似:

id | field1  | field 2
-----------------------
1  | value1  | value4
2  | value2  | value5
3  | value3  | value6
4  | value7  | value8
5  | value9  | value10
6  | value11 | value12

自己测试

您可以通过创建架构来尝试自己

 CREATE TABLE `my_db`.`my_table` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `field1` VARCHAR(45) NULL,
  `field2` VARCHAR(45) NULL,
  PRIMARY KEY (`id`)
 );

一些初始数据,以便您查看更新

INSERT INTO `my_db`.`my_table` (`field1`, `field2`) VALUES ('value', 'anotherValue');
INSERT INTO `my_db`.`my_table` (`field1`, `field2`) VALUES ('moreValue', 'justAnother');
INSERT INTO `my_db`.`my_table` (`field1`, `field2`) VALUES ('moreAndMore', 'valuesEverywhere');

然后只需执行查询就可以亲眼看看。

希望它有所帮助!

答案 3 :(得分:0)

REPLACE INTO 
texts (id, body)
VALUES
(NULL, 'create new row'),
(NULL, 'create other new row'),
(1, 'update id 1'),
(2, 'update id 2'),
(3, 'update id 3');