<?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>Der Informatikblog &#187; relation</title>
	<atom:link href="http://www.informatik-blog.net/tag/relation/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.informatik-blog.net</link>
	<description>Informatik &#38; Co.</description>
	<lastBuildDate>Mon, 28 Jun 2010 19:43:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Fremdschlüssel</title>
		<link>http://www.informatik-blog.net/2009/01/26/fremdschluessel/</link>
		<comments>http://www.informatik-blog.net/2009/01/26/fremdschluessel/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 22:17:23 +0000</pubDate>
		<dc:creator>bleed_ch</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[beziehung]]></category>
		<category><![CDATA[fremdschlüssel]]></category>
		<category><![CDATA[relation]]></category>
		<category><![CDATA[verbindung]]></category>

		<guid isPermaLink="false">http://www.informatik-blog.net/?p=316</guid>
		<description><![CDATA[Ein ganz wichtiges Kapitel, vorallem wenn es um die Planung eines etwas grösseren Projektes geht, ist das Thema Fremdschlüssel. Fremdschlüssel verbinden (meist tabellenübergreifend) Einträge. Nehmen wir an, wir haben eine &#8220;Mitglieder&#8221;-Tabelle. Diese Tabelle besitzt die Spalten &#8220;id&#8221; und &#8220;name&#8221; wobei ersteres der Primärschlüssel ist: Nun fügen wir eine weitere Tabelle namens &#8220;Tagebuch&#8221; hinzu. Sie beinhaltet [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Ein ganz wichtiges Kapitel, vorallem wenn es um die Planung eines etwas grösseren Projektes geht, ist das Thema Fremdschlüssel. Fremdschlüssel verbinden (meist tabellenübergreifend) Einträge. <span id="more-316"></span> Nehmen wir an, wir haben eine &#8220;Mitglieder&#8221;-Tabelle. Diese Tabelle besitzt die Spalten &#8220;id&#8221; und &#8220;name&#8221; wobei ersteres der Primärschlüssel ist:</p>
<p><img class="alignnone size-full wp-image-357" title="dbd-eins" src="http://www.informatik-blog.net/wp-content/uploads/2009/01/dbd-eins.png" alt="dbd-eins" width="170" height="180" /></p>
<p>Nun fügen wir eine weitere Tabelle namens &#8220;Tagebuch&#8221; hinzu. Sie beinhaltet die Spalten &#8220;id&#8221;, &#8220;mitglied_id&#8221; und &#8220;eintrag&#8221;. Der Primärschlüssel ist &#8220;id&#8221; und auf &#8220;mitglied_id&#8221; liegt ein Index:</p>
<p><img class="alignnone size-full wp-image-358" title="dbd-zwei" src="http://www.informatik-blog.net/wp-content/uploads/2009/01/dbd-zwei.png" alt="dbd-zwei" width="170" height="180" /></p>
<p>Der Index ist (je nach DBS) optional aber dringend empfohlen, da es sonst (vorallem mit wachsender Anzahl an Daten) zu starken Geschwindigkeitseinbussen kommen kann. Wir befüllen also die erste Tabelle:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> Mitglieder <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">42</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'A. Merkel'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>und dann noch die zweite:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> Tagebuch <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span> mitglied_id<span style="color: #66cc66;">,</span> eintrag<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">42</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'I am beautiful, no matter what they say...'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Damit es nicht zur Verwirrung kommt habe ich unserem Mitglied die &#8220;id&#8221; 42 gegeben. Doch was passiert wenn wir den Eintrag löschen? Nichts. Und genau das ist das Problem: Sobald wir das versuchen würden, müssten wir dafür sorgen dass in allen Untertabellen sämtliche Relationen aktualisiert werden. Da sowas aber je nach Umfang des Projektes sehr kompliziert enden kann, geben die Datenbanksysteme uns eine sehr nützliche Funktionalität:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> Tagebuch <span style="color: #993333; font-weight: bold;">ADD</span> <span style="color: #993333; font-weight: bold;">FOREIGN</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>mitglied_id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> Mitglieder<span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> CASCADE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE;</pre></div></div>

<p>Wir haben soeben erfolgreich einen Fremdschlüssel von &#8220;Tagebuch:mitglied_id&#8221; zu &#8220;Mitglied:id&#8221; definiert. Bildlich würde das ganze so aussehen:</p>
<p><img class="alignnone size-full wp-image-381" title="dbd-relation" src="http://www.informatik-blog.net/wp-content/uploads/2009/01/dbd-relation.png" alt="dbd-relation" width="440" height="180" /></p>
<p>Wenn wir jetzt unserem Mitglied eine neue &#8220;id&#8221; verpassen oder es komplett löschen, geschieht es seinen Tagebucheinträgen gleich. Ausserdem ist es jetzt nicht mehr möglich einen Eintrag mit ungültiger &#8220;mitglied_id&#8221; in das Tagebuch einzufügen.</p>
<p>Es gibt 5 Reaktionen bei Fremdschlüssel:</p>
<p>** <strong>NO ACTION</strong>, Verweigert die Änderung und löst ein Fehler aus.<br />
<strong>RESTRICT</strong>, Verweigert die Änderung und löst ein Fehler aus.<br />
<strong>CASCADE</strong>, Reagiert gleich wie sein Parent.<br />
<strong>SET DEFAULT</strong>, Setzt den Standardwert.<br />
<strong>SET NULL</strong>, Setzt NULL.</p>
<p>** Bei dieser Option ist eine verzögerte Überprüfung möglich um so einer Verletzung der Regel zuvorzukommen.</p>
<p>Information 1: Der Datentyp TEXT gehört nicht zum SQL-Standard. Deshalb wurde VARCHAR ohne Längenangabe verwendet.</p>
<p>Information 2: Das Datenbanksystem MySQL macht keinen Unterschied zwischen &#8220;NO ACTION&#8221; und &#8220;RESTRICT&#8221;.</p>
<p>Information 3: Unter MySQL sind Fremdschlüssel nur mit der Datenbankengine InnoDB möglich. Standard: MyISAM.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.informatik-blog.net/2009/01/26/fremdschluessel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
