<?xml version="1.0" encoding="UTF-8" ?>
<entry
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
	xml:lang="ja-JP"
>
	<title>なければ INSERT、あれば UPDATE</title>
	<id>tag:txqz.net,2007-01-17:blog/2007/01/17/1920</id>
	<link rel="self" href="http://txqz.net/blog/2007/01/17/1920.atom"/>
	<link rel="alternate" type="application/rss+xml" href="http://txqz.net/blog/2007/01/17/1920.rdf"/>
	<link rel="alternate" type="application/xhtml+xml" href="http://txqz.net/blog/2007/01/17/1920.xhtml"/>
	<link rel="alternate" type="text/html" href="http://txqz.net/blog/2007/01/17/1920.html"/>
	<link rel="contents" href="http://txqz.net/blog/2007/01/17/.atom" title="2007年1月17日"/>
	<link rel="first" href="http://txqz.net/blog/2001/08/04/0001.atom" title="地球空冷化"/>
	<link rel="prev" href="http://txqz.net/blog/2007/01/15/1023.atom" title="乗りなおしてみたら"/>
	<link rel="next" href="http://txqz.net/blog/2007/01/18/0004.atom" title="NEWS ZEROで2ちゃんねる"/>
	<link rel="last" href="http://txqz.net/blog/2010/02/14/1221.atom" title="VIASO/K-power追悼"/>
	<author>
		<name>陽坂智佐</name>
		<email>spambasket@txqz.net</email>
	</author>
	<content type="xhtml">
		<div xmlns="http://www.w3.org/1999/xhtml">
<p>すでにテーブルにある主キーやユニークキーと同じ値をふくむ行を挿入しようとするときに、こちらの想定する振る舞いをさせる方法のまとめ。まぁ、<a href="http://dev.mysql.com/doc/refman/4.1/ja/insert.html" title="MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.3 INSERT 構文">リファレンスマニュアルの INSERT 構文のところ</a>を見れば話は終わりなのだけれども。</p>
<table>
<thead><tr><th>ID (主キー)</th><th>値</th></tr></thead>
<tbody>
<tr><th>1</th><td>100</td></tr>
<tr><th>2</th><td>800</td></tr>
<tr><th>3</th><td>400</td></tr>
</tbody>
</table>
<dl>
<dt>間違って主キーと同じ値を含む行を挿入しようとしたらエラーを出して教えてほしいとき</dt>
<dd><p><code class="mysql">INSERT INTO test VALUES(1,100);</code> とすると、<samp>ERROR 1062 (23000): Duplicate entry '1' for key 1</samp> というエラーが出る。</p></dd>
<dt>間違って主キーと同じ値を含む行を挿入しようとしても無視して処理を続行してほしいとき</dt>
<dd><p><code class="mysql">INSERT IGNORE INTO test VALUES(1,100);</code> とすると、<samp>Query OK, 0 rows affected (0.00 sec)</samp> と表示される。テーブルは変更されていない。</p></dd>
<dt>主キーと同じ値を含む行がないなら新しく挿入し、あるならその行を更新してほしいとき</dt>
<dd><p><code class="mysql">REPLACE INTO test VALUES(1,500);</code> とすると、<samp>Query OK, 2 rows affected (0.00 sec)</samp> と表示される。削除してから挿入するので影響された行は2になる。テーブルは;</p>
<table>
<thead><tr><th>ID (主キー)</th><th>値</th></tr></thead>
<tbody>
<tr><th>1</th><td>500</td></tr>
<tr><th>2</th><td>800</td></tr>
<tr><th>3</th><td>400</td></tr>
</tbody>
</table>
<p><code class="mysql">REPLACE INTO test VALUES(4,200);</code> とすると、<samp>Query OK, 1 row affected (0.00 sec)</samp> と表示される。主キーが4である行はないので、そのまま挿入されて、影響された行は1になる。テーブルは;</p>
<table>
<thead><tr><th>ID (主キー)</th><th>値</th></tr></thead>
<tbody>
<tr><th>1</th><td>500</td></tr>
<tr><th>2</th><td>800</td></tr>
<tr><th>3</th><td>400</td></tr>
<tr><th>4</th><td>200</td></tr>
</tbody>
</table>
</dd>
<dt>主キーと同じ値を含む行がないなら新しく挿入し、あるならその行を元のデータを使って更新してほしいとき</dt>
<dd><p><code class="mysql">INSERT INTO test VALUES(1,100) ON DUPLICATE KEY UPDATE value = value + 100;</code> とすると、<samp>Query OK, 2 rows affected (0.00 sec)</samp> と表示される。削除してから挿入するので影響された行は2になる。テーブルは;</p>
<table>
<thead><tr><th>ID (主キー)</th><th>値</th></tr></thead>
<tbody>
<tr><th>1</th><td>600</td></tr>
<tr><th>2</th><td>800</td></tr>
<tr><th>3</th><td>400</td></tr>
<tr><th>4</th><td>200</td></tr>
</tbody>
</table>
</dd>
</dl>
<p>最後の構文は無駄な IF 文を除去するのに最適なのでぜひおさえておきたい。</p>
		</div>
	</content>
	<category term="MySQL"/>
	<trackback:ping>http://txqz.net/blog/2007/01/17/1920/tb</trackback:ping>
	<trackback:about>http://bittorrentlove.blog58.fc2.com/blog-entry-260.html</trackback:about>
	<published>2007-01-17T19:20:00+09:00</published>
	<updated>2007-08-22T12:08:20+09:00</updated>
	<rights>Attribution-Noncommercial-Share Alike 3.0 Unported</rights>
</entry>