菜单

mysql 存在立异 不存在插入

2019年6月27日 - sqlite

 

IF (SELECT * FROM ipstats WHERE ip='192.168.0.1') {    UPDATE ipstats SET clicks=clicks+1 WHERE ip='192.168.0.1';} else {    INSERT INTO ipstats (ip, clicks) VALUES ('192.168.0.1', 1);}

 

create table xx (sad,xasd,asda,primary
key(a,x,a));就能够用了,注意一定要有由主键和唯一索引^_^

那是出于index_var索引的为1024 * 3 + 1 + 1024 * 3 >
一千变成的,假设遇到这种境况怎么做?有三种化解办法。

mysql> INSERT INTO test values ( 3,’insertName’ )
    -> ON DUPLICATE KEY UPDATE uname=’updateName’;
Query OK, 2 rows affected (0.03 sec)

利用dual虚拟表来促成。

瞩目,要运用那条语句,前提条件是其一表必须有贰个唯一索引或主键。

留意:var1和var3的最大尺寸由100变为了1024,此时实行该创造语句时会报如下错误:

mysql> select * from test;
+—–+————+
| uid | uname      |
+—–+————+
|   1 | uname1     |
|   2 | uname2     |
|   3 | updateName |
+—–+————+
3 rows in set (0.00 sec)

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

原来须求推行3条SQL语句,如下:

 

CREATE TABLE ipstats (ip VARCHAR(15) NOT NULL UNIQUE,clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0');

http://www.bkjia.com/Mysql/487302.htmlwww.bkjia.comtruehttp://www.bkjia.com/Mysql/487302.htmlTechArticlemysql处理存在则更新,不存在则插入(多列唯一索引)
mysql管理有些唯一索引时存在则更新,不存在则插入的地方相应是很广阔的,英特网也…

INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;

 

前几日写程序,新意识……………………,万分不错^_^,省略了重重素养,每一日1G多的日志!!

方法一:

举例ipstats表结构如下:

看这里

MySQL 自4.1版之后开首帮忙INSERT … ON DUPLICATE KEY
UPDATE语法,使得原来须求进行3条SQL语句(SELECT,INSERT,UPDATE),缩减为1条语句就可以产生。

该条插入语句的意义是:向test_table表中插入,倘使不设有val1 =
‘abcd’,val2 = 0, val3 = ‘xyz’的记录,那就插入

mysql> select * from test;
+—–+——–+
| uid | uname |
+—–+——–+
|   1 | uname1 |
|   2 | uname2 |
|   3 | me     |
+—–+——–+
3 rows in set (0.00 sec)

 

INSERT … ON DUPLICATE KEY
UPDATE,当插入的记录会引发主键争论只怕违反唯一约束时,则利用UPDATE更新旧的记录,不然插入新记录。

先是,将数据库的engine由MyISAM换到InnoDB就可以了,那么那四个引擎有如何差距吗?

mysql> create index i_test_uname on test(uname);
Query OK, 3 rows affected (0.20 sec)
Records: 3 Duplicates: 0 Warnings: 0

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

mysql> select * from test;
+—–+—————-+
| uid | uname          |
+—–+—————-+
|   2 | uname2         |
|   1 | update2records |
|   3 | updateName     |
+—–+—————-+
3 rows in set (0.00 sec)

[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');  

看程序竟然开掘Mysql有这些效果!

[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;  

mysql> INSERT INTO test VALUES ( 1 , ‘uname2’)   
-> ON DUPLICATE KEY UPDATE uname=’update2records’;
Query OK, 2 rows affected (0.00 sec)

如此那般,的确是从未难题的,不过,要是表的开创如下:

插入时会与两条记下发生冲突,分别由主键和唯一索引引起。但最后只UPDATE了里面一条。那在手册中也证实了,有多少个唯一索引(恐怕有键也许有唯一索引)的情形下,不提出利用该语句。

[sql] 
Specified key was too long; max key length is 1000 bytes  

而现行反革命只需上面1条SQL语句就能够成功:

[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;  

再看一例子:
mysql> desc test;
+——-+————-+——+—–+———+——-+
| Field | Type        | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| uid   | int(11)     | NO   | PRI |         |       |
| uname | varchar(20) | YES |     | NULL    |       |
+——-+————-+——+—–+———+——-+
2 rows in set (0.00 sec)

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

 

 

 

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

不过,那样换有叁个缺点,正是InnoDB的性质没有MyISAM的好,那么只要想要不就义质量的话,那就唯有用第三个主意了,约等于我们这边说的法门二!

使用

 

 

 

 

那儿,借使val1 = ‘abcd’,val2 = 0, val3 =
‘xyz’的笔录不设有,那么就能够实施该插入语句插入该记录,借使存在,那就供给大家再采纳相应的更新语句来更新记录:

的说话,此时大家能够用于下语句取代:

选择dual虚拟表来促成的话就不必要创制多列唯一索引了,表的创办如下:

[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;  

OK!到此处,基本上讲完了。

表的创制如下:

 

 

[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;  

 

mysql处理有些唯一索引时存在则更新,不存在则插入的气象应该是很广阔的,英特网也许有十分的多看似的篇章,笔者明日就讲讲当以此唯一的目录是多列唯一索引时或许会跨越的主题材料和方法。

[sql] 
INSERT INTO table  
(primarykey, field1, field2, ...)  
SELECT key, value1, value2, ...  
FROM dual  
WHERE not exists (select * from table where primarykey = id);  
[sql] 
UPDATE `test_table` SET   
`value1` = `value1` + 1, `value2` = `value2` + 2, `value3` = `value3` + 3  
WHERE `val1` = 'abcd' AND `val2` = 0 AND `val3` = 'xyz';  

方法二:

插入语句则是形如:

在这之中该表中var1、var2和var3完全同样的笔录只好有一条,所以建了贰个多列唯一索引index_var,那样一来大家就能够动用
 INSERT INTO ON … DUPLICATE KEY UPDATE …
来贯彻插入数据时存在则更新,不设有则插入的坚守了,如下:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图