<?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>ManCanDo - PhP, MySQL, DIY, porady i triki &#187; &#187; InnoDB</title>
	<atom:link href="http://www.mancando.pl/tag/innodb/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mancando.pl</link>
	<description>Co kupować a czego nie? Ciekawostki z zakresu programowania w PHP. Sztuczki i kruczki MySQL. Zagadnienia z zakresu grafiki komputerowej. Opisy ciekawych rzeczy, które można wykonać samodzielnie.</description>
	<lastBuildDate>Thu, 05 Dec 2013 18:50:19 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>Kaskadowe usuwanie rekordów w MySQL (mechanizm składowania InnoDB)</title>
		<link>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/</link>
		<comments>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/#comments</comments>
		<pubDate>Fri, 18 Jan 2013 11:43:20 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=15</guid>
		<description><![CDATA[Wielu programistów korzystających w swoich projektach z tandemu złożonego z PHP i MySQL poświęca swój czas na programową obsługę integralności danych znajdujących się w bazie. Jest oczywiście całkiem duże grono osób, które zupełnie nie zaprzątają sobie tym głowy. Śmietnik w &#8230; <a href="http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[
<!-- Easy Plugin for AdSense V7.51 -->
<!-- [leadin: 2 urCount: 2 urMax: 0] -->
<div class="ezAdsense adsense adsense-leadin" style="text-align:center;margin:20px 0px;"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- mancando-poziomy -->
<ins class="adsbygoogle"
     style="display:inline-block;width:728px;height:90px"
     data-ad-client="ca-pub-2234288553315702"
     data-ad-slot="2233930472"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<!-- Easy Plugin for AdSense V7.51 -->
<p><img class="alignright size-full wp-image-51" style="border: 0px none;" alt="komputerek_mysql" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />Wielu programistów korzystających w swoich projektach z tandemu złożonego z <strong>PHP</strong> i <strong>MySQL</strong> poświęca swój czas na programową obsługę integralności danych znajdujących się w bazie. Jest oczywiście całkiem duże grono osób, które zupełnie nie zaprzątają sobie tym głowy. Śmietnik w bazie danych oczywiście nie zaszkodzi prostym małym projektom i może najwyżej zaszkodzić reputacji programisty tworzącemu tego typu serwisy. W przypadku rozbudowanych aplikacji w których baza danych składa się z dziesiątek tabel rozrastających się w trakcie życia projektu do rozmiarów liczonych w gigabajty, porządek jest już rzeczą niebagatelną i relatywnie wpływającą na szybkość działania witryny. Właśnie w takich przypadkach warto skorzystać z mechanizmów jakie oferują relacyjne bazy danych.</p>
<p><span id="more-15"></span></p>
<p>Kilka lat temu w <strong>MySQL</strong> domyślnym typem tabel był <strong>MyISAM</strong> i chociaż <strong>InnnoDB</strong> było wtedy już dostępne to jednak niewiele osób korzystało z tego rozwiązania. Szkoda, bo mimo pewnych wad, niewątpliwą zaletą <strong>InnoDB</strong> jest możliwość zrzucenia utrzymywania integralności danych na <strong>MySQL&#8217;a.</strong> Poświęcając odpowiednią ilość czasu na wykonanie prawidłowego projektu relacyjnej bazy danych opartej na tabelach typu <strong>InnoDB,</strong> nie będziemy tracić czasu na kodowanie odpowiednich metod utrzymujących integralność danych w bazie.</p>
<p>Jedną z podstawowych zalet mechanizmu składowania <strong>InnoDB,</strong> której nie posiada My<strong>I</strong>SAM to możliwość definiowania kluczy obcych w tabelach. W przypadku <strong>MyISAM</strong> klucze obce mogły być jedynie indeksowane, co oczywiście wpływało na na szybkość wykonywania zapytań jednak nie miało przełożenia na utrzymywanie integralności danych. Osobiście uważam, że w obecnej chwili poza wyjątkowymi sytuacjami praktycznie nie ma uzasadnienia by w swoich projektach wciąż kurczowo trzymać się <strong>MyISAM.</strong> Część osób w tym momencie powie, że <strong>InnoDB</strong> nie ma wyszukiwania pełno-tekstowego (<strong>Full-text search indexes</strong>) &#8230; <strong>no cóż od wersji 5.6.4 już ma</strong>, więc jeśli dysponujesz taką lub wyższą wersją MySQL, to wtedy pada ostatni bastion by nie używać <strong>InnoDB.</strong></p>
<p>Warto zauważyć, że w przypadku istniejących tabel, zmiana mechanizmu składowania nie wymaga ponownego tworzenia tabel. Zmianę można dokonać wykonując poniższe zapytanie:</p>
<p><code>ALTER TABLE `nazwa_tabeli` ENGINE = InnoDB</code></p>
<p>Metodę definiowania kluczy obcych opiszę na podstawie przykładów opartych na poniższym schemacie ERD prostej bazy danych:<img class="alignleft size-full wp-image-16" alt="Schemat tabel" src="http://mancando.pl/wp-content/uploads/2013/01/fk_pk.png" width="800" height="107" /></p>
<p>Baza składa się z dwóch tabel w których przechowywane są dane oraz jednej tabeli asocjacyjne, która je wiąże ze sobą. Po utworzeniu tabel i nadaniu odpowiednich indeksów na klucze można przejść do definiowania kluczy obcych.</p>
<p><code>ALTER TABLE `uzytkownik_typ` ADD FOREIGN KEY ( `id_uzytkownik` ) REFERENCES `uzytkownik` (`id_uzytkownik`) ON DELETE CASCADE ON UPDATE CASCADE ;</code></p>
<p><code>ALTER TABLE `uzytkownik_typ` ADD FOREIGN KEY ( `id_typ` ) REFERENCES `typ` (`id_typ`) ON DELETE CASCADE ON UPDATE CASCADE ;</code></p>
<p><strong>I już! Dzięki tym prostym zabiegom uzyskaliśmy pełną integralność danych w bazie, oraz kaskadowe usuwanie rekordów.</strong> Oznacza to, że każdorazowe usunięcie rekordu z tabeli `typ` lub też `uzytkownik` spowoduje usunięcie wszystkich wystąpień kasowanego klucza obcego w tabeli `uzytkownik_typ`. Przykład:</p>
<p><code>DELETE FROM `uzytkownik` WHERE `uzytkownik`.`id_uzytkownik` = 1</code></p>
<p>Wykonanie powyższego zapytania spowoduje usunięcie z tabeli `uzytkownicy` rekordu o identyfikatorze 1. Mechanizmy bazy danych, dążące do utrzymania integralności danych w tabelach wykonaja jednak również usunięcie wszystkich typów przypisanych do kasowanego użytkownika. Usnięte zostaną wszystkie rekordy z tabeli `uzytkownik_typ` w których wartość klucza obcego `id_uzytkownik` są równe 1.</p>
<p>Analogiczna sytuacja będzie występować w przypadku zmiany wartości klucza głównego w tabeli, `uzytkownik` lub `typ`. Każda z takich zmian będzie kaskadowo przenoszona na tabelę asocjacyjną `uzytkownik_typ`.</p>
<p>Jedna uwaga odnośnie modyfikacji istniejących tabel. Sama <strong>zmiana mechanizmów składowania na InnoDB nie wymaga zachowania integralności, jednak zdefiniowanie kluczy obcych wymaga doprowadzenia tabel do porządku</strong>. Sytuacja gdy tabela będzie  zwiera rekordy w których występują klucze obce, których nie ma w macierzystej, spowoduje zablokowanie możliwości ich zdefiniowania. W takich przypadkach przed definiowaniem kluczy obcych, dane w tabeli muszą być w pełni uporządkowane względem pozostałych tabel. Musisz samodzielnie przeprowadzić integrację tabel.</p>

<!-- Easy Plugin for AdSense V7.51 -->
<!-- [leadout: 3 urCount: 3 urMax: 0] -->
<div class="ezAdsense adsense adsense-leadout" style="text-align:center;margin:12px;"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- mancando-poziomy -->
<ins class="adsbygoogle"
     style="display:inline-block;width:728px;height:90px"
     data-ad-client="ca-pub-2234288553315702"
     data-ad-slot="2233930472"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<!-- Easy Plugin for AdSense V7.51 -->
]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
