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テーブルの構造は次のとおりです.
SQL文は、次のように3つ実行する必要があります.
次のSQL文の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
今日はプログラムを書いて、新発見・・・・・・、かなりいいですね^^、多くの工夫を省略して、毎日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