<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code et ornithorynques insectes &#187; on duplicate key</title>
	<atom:link href="http://www.eiodal.com/tag/on-duplicate-key/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.eiodal.com</link>
	<description>Un blog utilisant très probablement WordPress</description>
	<lastBuildDate>Wed, 16 Dec 2009 11:21:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL : Insert ou update dans une seule et même requête</title>
		<link>http://www.eiodal.com/insert-update-une-seule-requete/</link>
		<comments>http://www.eiodal.com/insert-update-une-seule-requete/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 11:11:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[on duplicate key]]></category>

		<guid isPermaLink="false">http://www.eiodal.com/?p=61</guid>
		<description><![CDATA[Dans une application web on peut avoir besoin de modifier un enregistrement si il existe, ou de le créer si il n&#8217;existe pas.
La première chose qui viens à l&#8217;esprit est d&#8217;effectuer cela en deux requêtes : un &#171;&#160;SELECT&#160;&#187; pour savoir si l&#8217;enregistrement est présent, puis un &#171;&#160;INSERT&#160;&#187; ou un &#171;&#160;UPDATE&#160;&#187; en fonction du résultat. C&#8217;est [...]<p>Source : <a href="http://www.eiodal.com">Blog cakephp, sql, seo, hébergements, improbabilités</a><br/><br/><a href="http://www.eiodal.com/insert-update-une-seule-requete/">SQL : Insert ou update dans une seule et même requête</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Dans une application web on peut avoir besoin de <strong>modifier un enregistrement si il existe</strong>, ou de <strong>le créer si il n&#8217;existe pas</strong>.</p>
<p>La première chose qui viens à l&#8217;esprit est d&#8217;effectuer cela en deux requêtes : un &laquo;&nbsp;SELECT&nbsp;&raquo; pour savoir si l&#8217;enregistrement est présent, puis un &laquo;&nbsp;INSERT&nbsp;&raquo; ou un &laquo;&nbsp;UPDATE&nbsp;&raquo; en fonction du résultat. C&#8217;est un peu lourd pour une requête basique comme celle-ci.</p>
<p>Mais bien sûr notre ami SQL à tout prévu, et on peut réaliser cela en une malheureuse requête grâce à la clause <strong>&laquo;&nbsp;ON DUPLICATE KEY&nbsp;&raquo;</strong>.</p>
<p><span id="more-61"></span></p>
<h3>Le contexte</h3>
<p>Fermez les yeux et imaginez &#8230; Un site ou l&#8217;on doit enregistrer l&#8217;adresse ip et le nom du navigateur de chaque visiteurs avec la date de dernière connexion à la page. On va faire un &laquo;&nbsp;INSERT&nbsp;&raquo; avec toutes les infos la première fois que le visiteur va se connecter. Mais à ses prochaines connexions on va seulement modifier la date de connexion de ce même utilisateur, l&#8217;ip et le navigateur resterons les mêmes (sauf si il en change, ok).</p>
<h3>La table</h3>
<p>Dans un premier temps on créé une table &laquo;&nbsp;users&nbsp;&raquo; avec les champs :  id | ip | navigateur | date .</p>
<p>Ensuite le point le plus important : on mets un <strong>index &laquo;&nbsp;UNIQUE&nbsp;&raquo;</strong> sur les champs &laquo;&nbsp;ip&nbsp;&raquo; et &laquo;&nbsp;navigateur&nbsp;&raquo;. C&#8217;est cela qui va permettre de savoir si on fait un update ou un insert.</p>
<h3>La requête</h3>
<p>Lorsque le visiteur passe sur la page on exécute cette requête  (en admettent le fait que dans la variable $ip se trouve l&#8217;adresse ip de la personne et dans $nav le nom du navigateur) :</p>
<pre class="brush: sql;">
INSERT INTO users
(id, ip, navigateur, date)
VALUES ($ip, $nav, NOW())
ON DUPLICATE KEY UPDATE date = NOW()
</pre>
<p>La requête va enregistrer l&#8217;adresse ip ($ip) avec la date de connexion (NOW()) si la combinaison ip/navigateur n&#8217;existe pas déjà. Si cette combinaison existe elle va simplement modifier la valeur du champs &laquo;&nbsp;date&nbsp;&raquo;.</p>
<p>Source : <a href="http://www.eiodal.com">Blog cakephp, sql, seo, hébergements, improbabilités</a><br/><br/><a href="http://www.eiodal.com/insert-update-une-seule-requete/">SQL : Insert ou update dans une seule et même requête</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eiodal.com/insert-update-une-seule-requete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
