on duplicate key update之多列唯一索引

mysql处理存在则更新,不存在则插入(多列唯一索引)

mysql处理存在则更新,不存在则插入(多列唯一索引)

mysql处理某个唯一索引时存在则更新,不存在则插入的情况应该是很常见的,网上也有很多类似的文章,我今天就讲讲当这个唯一的索引是多列唯一索引时可能会遇到的问题和方法。

方法一:

使用

?


1

INSERT INTO ON ... DUPLICATE KEY UPDATE ...

表的创建如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

[sql]

CREATE TABLE `test_table` ( 

  `id`  int(11) NOT NULL AUTO_INCREMENT , 

  `var1`  varchar(100) CHARACTER SET utf8 DEFAULT NULL

  `var2`  tinyint(1) NOT NULL DEFAULT ‘0‘

  `var3`  varchar(100) character set utf8 default NULL

  `value1`  int(11) NOT NULL DEFAULT ‘1‘

  `value2`  int(11) NULL DEFAULT NULL

  `value3`  int(5) DEFAULT NULL

  PRIMARY KEY (`Id`), 

  UNIQUE INDEX `index_var` (`var1`, `var2`, `var3`) 

) ENGINE=MyISAM DEFAULT CHARACTER SET=latin1 AUTO_INCREMENT=1; 

其中该表中var1、var2和var3完全相同的记录只能有一条,所以建了一个多列唯一索引index_var,这样一来我们就可以使用  INSERT INTO ON ... DUPLICATE KEY UPDATE ... 来实现插入数据时存在则更新,不存在则插入的功能了,如下:

?


1

2

3

4

5

6

[sql]

INSERT INTO `test_table`  

(`var1`, `var2`, `var3`, `value1`, `value2`, `value3`) VALUES

(‘abcd‘, 0, ‘xyz‘, 1, 2, 3)  

ON DUPLICATE KEY UPDATE `value1` = `value1` + 1 AND

`value2` = `value2` + 2 AND `value3` = `value3` + 3;

该条插入语句的含义是:向test_table表中插入,如果不存在val1 = ‘abcd‘,val2 = 0, val3 = ‘xyz’的记录,那就插入

val1 = ‘abcd‘,val2 = 0, val3 = ‘xyz’,value1 = 1, value2 = 2, value3 = 3的记录,

如果存在,那就更新value1的值为value1+1,更新value2的值为value2+2,更新value3的值为value3+3。

这样,的确是没有问题的,但是,如果表的创建如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

[sql]

CREATE TABLE `test_table` ( 

  `id`  int(11) NOT NULL AUTO_INCREMENT , 

  `var1`  varchar(1024) CHARACTER SET utf8 DEFAULT NULL

  `var2`  tinyint(1) NOT NULL DEFAULT ‘0‘

  `var3`  varchar(1024) character set utf8 default NULL

  `value1`  int(11) NOT NULL DEFAULT ‘1‘

  `value2`  int(11) NULL DEFAULT NULL

  `value3`  int(5) DEFAULT NULL

  PRIMARY KEY (`Id`), 

  UNIQUE INDEX `index_var` (`var1`, `var2`, `var3`) 

) ENGINE=MyISAM DEFAULT CHARACTER SET=latin1 AUTO_INCREMENT=1;

注意:var1和var3的最大长度由100变成了1024,此时执行该创建语句时会报如下错误:

?


1

2

[sql]

Specified key was too long; max key length is 1000 bytes

这是由于index_var索引的为1024 * 3 + 1 + 1024 * 3 > 1000导致的,如果遇到这种情况怎么办?有两种解决办法。

第一,将数据库的engine由MyISAM换成InnoDB就可以了,那么这两个引擎有什么区别呢?

看这里

不过,这样换有一个缺点,就是InnoDB的性能没有MyISAM的好,那么如果想要不牺牲性能的话,那就只有用第二个方法了,也就是我们这里说的方法二!

方法二:

使用dual虚拟表来实现。

使用dual虚拟表来实现的话就不需要创建多列唯一索引了,表的创建如下:

?


1

2

3

4

5

6

7

8

9

10

11

[sql]

CREATE TABLE `test_table` ( 

  `id`  int(11) NOT NULL AUTO_INCREMENT , 

  `var1`  varchar(1024) CHARACTER SET utf8 DEFAULT NULL

  `var2`  tinyint(1) NOT NULL DEFAULT ‘0‘

  `var3`  varchar(1024) character set utf8 default NULL

  `value1`  int(11) NOT NULL DEFAULT ‘1‘

  `value2`  int(11) NULL DEFAULT NULL

  `value3`  int(5) DEFAULT NULL

  PRIMARY KEY (`Id`) 

) ENGINE=MyISAM DEFAULT CHARACTER SET=latin1 AUTO_INCREMENT=1;

插入语句则是形如:

?


1

2

3

4

5

6

[sql]

INSERT INTO table

(primarykey, field1, field2, ...) 

SELECT key, value1, value2, ... 

FROM dual 

WHERE not exists (select * from table where primarykey = id);

的语句,此时我们可以用以下语句代替:

?


1

2

3

4

5

[sql]

INSERT INTO `test_table` SELECT 0, ‘abcd‘, 0, ‘xyz‘, 1, 2, 3 

FROM dual WHERE NOT EXISTS ( 

SELECT * FROM `test_table` WHERE

`var1` = ‘abcd‘ AND `var2` = 0 AND `var3` = ‘xyz‘);

此时,如果val1 = ‘abcd‘,val2 = 0, val3 = ‘xyz’的记录不存在,那么就会执行该插入语句插入该记录,如果存在,那就需要我们再使用相应的更新语句来更新记录:

?


1

2

3

4

[sql]

UPDATE `test_table` SET

`value1` = `value1` + 1, `value2` = `value2` + 2, `value3` = `value3` + 3 

WHERE `val1` = ‘abcd‘ AND `val2` = 0 AND `val3` = ‘xyz‘;

OK!到这里,基本上讲完了。

时间: 2024-10-07 03:50:30

on duplicate key update之多列唯一索引的相关文章

MySQL: ON DUPLICATE KEY UPDATE 用法

使用该语法可在插入记录的时候先判断记录是否存在,如果不存在则插入,否则更新,很方便,无需执行两条SQL 这个语句知识mysql中,而标准sql语句中是没有的. INSERT INTO .. ON DUPLICATE KEY更新多行记录 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值列重复的问题,则插入新行.例如,如果列a被定义为UNIQUE,并

INSERT 中ON DUPLICATE KEY UPDATE的使用

使用场景,在做全国各省ip访问统计时要将sparkStreaming的数据存在mysql中,按照一般设计,id,province,counts,time,这样就需要每次清空表,但是如果多分区的话就存在删除表的时候回出现后一个分区可能把前一个分区的数据删除掉,当然最好的办法是每次都只更新而不删除,但是如果通过代码实现比较复杂. 此时我们需要的就是如果存在则更新,如果不存在则新增. 用redis的kv就可以很容易的实现.在MySQL中也有这样的功能.INSERT 中ON DUPLICATE KEY

on duplicate key update

mysql "ON DUPLICATE KEY UPDATE" 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不会导致唯一值列重复的问题,则插入新行. 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: 代码如下: INSERT INTO TABLE (a,c) VALUES (1,3

深入mysql "ON DUPLICATE KEY UPDATE" 语法的分析

mysql "ON DUPLICATE KEY UPDATE" 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不会导致唯一值列重复的问题,则插入新行. 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: 复制代码代码如下: INSERT INTO TABLE (a,c) VALUES

[转]主键冲突的话就更新否则插入 (ON DUPLICATE KEY UPDATE )

mysql "ON DUPLICATE KEY UPDATE" 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不会导致唯一值列重复的问题,则插入新行. 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: INSERT INTO TABLE (a,c) VALUES (1,3) ON D

mysql ON DUPLICATE KEY UPDATE重复插入时更新

mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (client_id,client_name,client_type) SELECT supplier_id,supplier_name,'advertising' FROM suppliers WHERE not exists(select * from clients where clients.c

MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)

本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,各位同学可尝试参考. 案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:  代码如下 复制代码 1 INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('[email protec

mysql ON DUPLICATE KEY UPDATE、REPLACE INTO

INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?前提条件是这个表必须有一个唯一索引或主键. 1.REPLACE发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空.2.INSERT发现重复的是更新操作.在原有记录基础上,更新指定字段内容,其它字段内容保留. 这样REPLACE的操作成本要大于 insert  ON DUPLICATE

MySQL--INSERT INTO ... ON DUPLICATE KEY UPDATE ...

转自:https://my.oschina.net/iceman/blog/53735 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值, 则在出现重复值的行执行UPDATE: 如果不会导致唯一值列重复的问题,则插入新行. 注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法! 这个语法和适合用在需要判断记录是否存在,不存在则插入存在则更新的场