mysql存在更新存在挿入なし

4868 ワード

プログラムを見てMysqlにこの機能があることに気づいた!
今日はプログラムを書いて、新発見・・・・・・、かなりいいですね^^、多くの工夫を省略して、毎日1 G余りのログ!!
MySQLは4.1版以降INSERT…ON DUPLICATE KEY UPDATE構文をサポートしているため、本来はSQL文(SELECT,INSERT,UPDATE)を3つ実行する必要があり、1つの文に短縮すれば完成する.
INSERT ... ON DUPLICATE KEY UPDATEは、挿入されたレコードがプライマリ・キーの衝突を起こしたり、一意の制約に違反したりした場合、UPDATEを使用して古いレコードを更新します.そうしないと、新しいレコードを挿入します.
例えば、ipstatsテーブルの構造は次のとおりです.
CREATE TABLE ipstats (ip VARCHAR(15) NOT NULL UNIQUE,clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0');

SQL文は、次のように3つ実行する必要があります.
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);}

次のSQL文の1つだけで完了します.
INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+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)mysql> select * from test;+-----+--------+| uid | uname |+-----+--------+|   1 | uname1 | |   2 | uname2 | |   3 | me     | +-----+--------+3 rows in set (0.00 sec)mysql> INSERT INTO test values ( 3,'insertName' )    -> ON DUPLICATE KEY UPDATE uname='updateName';Query OK, 2 rows affected (0.03 sec)mysql> select * from test;+-----+------------+| uid | uname      |+-----+------------+|   1 | uname1     | |   2 | uname2     | |   3 | updateName | +-----+------------+3 rows in set (0.00 sec)mysql> create index i_test_uname on test(uname);Query OK, 3 rows affected (0.20 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> INSERT INTO test VALUES ( 1 , 'uname2')    -> ON DUPLICATE KEY UPDATE uname='update2records';Query OK, 2 rows affected (0.00 sec)mysql> select * from test;+-----+----------------+| uid|uname|+----+----------------------------+|2|uname 2||1|update 2 records||3|updateName|+----+----------------------------++3 rows in set(0.00 sec)挿入時に2つのレコードと衝突し、それぞれプライマリ・キーとユニーク・インデックスによって引き起こされる.しかし、最終的にはUPDATEの1つしかありません.これは、複数のユニークインデックス(またはキーとユニークインデックス)がある場合、この文は推奨されません.
create table xx (sad,xasd,asda,primary key(a,x,a));使えますので、必ずプライマリキーとユニークインデックスがあることに注意してください^^;
転載先:https://www.cnblogs.com/sunss/archive/2010/10/05/1844208.html