<?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>rodrigoaguas.com &#187; BD</title>
	<atom:link href="http://www.rodrigoaguas.com/blog/category/bd/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rodrigoaguas.com/blog</link>
	<description>Desenvolvimento de sites Web: acessibilidade, usabilidade, ASP, PHP, XHTML, CSS e Ajax.</description>
	<lastBuildDate>Tue, 01 Jun 2010 14:53:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Criação de Tabelas e Relacionamentos com SQL</title>
		<link>http://www.rodrigoaguas.com/blog/criacao-de-tabelas-e-relacionamentos-com-sql/</link>
		<comments>http://www.rodrigoaguas.com/blog/criacao-de-tabelas-e-relacionamentos-com-sql/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 15:50:49 +0000</pubDate>
		<dc:creator>Rodrigo Aguas</dc:creator>
				<category><![CDATA[BD]]></category>

		<guid isPermaLink="false">http://www.rodrigoaguas.com/blog/criacao-de-tabelas-e-relacionamentos-com-sql/</guid>
		<description><![CDATA[Já escrevi sobre a criação de relacionamentos no MySQL anteriormente, então não serei repetitivo em falar sobre as mesmas coisas, mas aconselho a leitura do artigo anterior para os que não tiverem intimidade com relacionamentos de banco de dados.
Neste me concentrarei em mostrar a criação de relacionamentos utilizando apenas comandos SQL, não que isso dispense [...]]]></description>
			<content:encoded><![CDATA[<p>Já escrevi sobre a <a href="http://www.rodrigoaguas.com/blog/criando-relacionamentos-no-mysql/">criação de relacionamentos no MySQL</a> anteriormente, então não serei repetitivo em falar sobre as mesmas coisas, mas aconselho a leitura do artigo anterior para os que não tiverem intimidade com relacionamentos de banco de dados.</p>
<p>Neste me concentrarei em mostrar a criação de relacionamentos utilizando apenas comandos SQL, não que isso dispense a utilização de uma interface com o banco de dados para a execução dos mesmos. Para isso, podemos utilizar além do próprio <a href="http://dev.mysql.com/downloads/gui-tools/">MySQL Query Browser</a>, o <a href="http://www.phpmyadmin.net/" target="_blank">phpMyAdmin</a> ou outro programa de sua preferência que permita a execução de códigos SQL na base de dados.</p>
<p>Basearei minhas explicações em exemplos para a criação de um banco de dados para uma &#8220;biblioteca&#8221; (inventado apenas para nos servir de exemplo, então longe de ser completo o suficiente para uma aplicação real). Iniciaremos, criando a tabela de autores, contendo o nome do mesmo e um identificador:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> autor <span style="color: #66cc66;">&#40;</span><br />
id int<span style="color: #66cc66;">,</span><br />
nome varchar<br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
<p>No código anterior contemplamos apenas a estrutura da tabela, ignorando a definição da chave primária e dos campos que não aceitam valores nulos. Então, colocaremos o id como chave primária (primary key, ou apenas pk) e auto incrementada, para que o seu valor seja gerado pelo próprio MySQL. Além disso, o campo nome passa a não aceitar valores nulos, pois o padrão é que qualquer coluna aceite valores nulos. Existem outras sintaxes para esse comando, mas mostrarei apenas a que considero mais simples (mas não possibilita a criação de chaves compostas).</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> autor <span style="color: #66cc66;">&#40;</span><br />
id int <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span><br />
nome varchar <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
<p>Então, nossa tabela de autores está pronta. Criaremos agora a tabela de livros. Para simplificar, considerarei que um livro será escrito por apenas um autor, assim teremos que cada livro fará referência a exato um registro da tabela de autores. Armazenaremos, além do autor, apenas ISBN, título e edição do livro.</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> livro <span style="color: #66cc66;">&#40;</span><br />
id int <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span><br />
isbn int <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
titulo varchar <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
edicao int <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
<p>Já que o ISBN é um identificador único para as edições dos livros, poderíamos utilizá-lo como chave primária, mas não faremos isso, apenas não aceitaremos valores repetidos no ISBN, para isso utilizaremos unique nessa coluna. Além disso, temos ainda que criar uma coluna para o relacionamento com a tabela de autores e constraint de chave estrangeira (foreign key, ou apenas fk).</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> livro <span style="color: #66cc66;">&#40;</span><br />
id int <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span><br />
isbn int <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">UNIQUE</span><span style="color: #66cc66;">,</span><br />
titulo varchar <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
edicao int <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
autor int <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><br />
constraint fk_autor <span style="color: #993333; font-weight: bold;">FOREIGN</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> autor<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;">DELETE</span> restrict <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> restrict<br />
<span style="color: #66cc66;">&#41;</span><br />
engine <span style="color: #66cc66;">=</span> InnoDB</div></td></tr></tbody></table></div>
<p>Não comentei sobre a última linha do comando, ela determina o tipo de tabela que o MySQL criará. É necessário acrescentá-la por causa da foreign key, que não é suportada por qualquer tipo de tabela.</p>
<p>A criação das tabelas de autor e livro já foram suficientes para mostrar o básico da sintaxe de criação de tabela e já temos um (mini) banco de dados funcionando. Existem muitos detalhes que não foram comentados nesse artigo, quem quiser pode encontrá-los na <a href="http://dev.mysql.com/doc/refman/5.1/en/create-table.html">documentação do MySQL</a>.</p>
<p>Espero ter respondido aos pedidos feitos nos comentários do outro artigo. Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rodrigoaguas.com/blog/criacao-de-tabelas-e-relacionamentos-com-sql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Atualização do passo-a-passo de como criar relacionamentos no MySQL</title>
		<link>http://www.rodrigoaguas.com/blog/atualizacao-do-passo-a-passo-de-como-criar-relacionamentos-no-mysql/</link>
		<comments>http://www.rodrigoaguas.com/blog/atualizacao-do-passo-a-passo-de-como-criar-relacionamentos-no-mysql/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 03:31:48 +0000</pubDate>
		<dc:creator>Rodrigo Aguas</dc:creator>
				<category><![CDATA[BD]]></category>

		<guid isPermaLink="false">http://www.rodrigoaguas.com/blog/atualizacao-do-passo-a-passo-de-como-criar-relacionamentos-no-mysql/</guid>
		<description><![CDATA[Observando o grande número de acessos ao artigo de criação de relacionamentos no MySQL, resolvi dar uma melhorada nele acrescentando imagens das telas dos passos indicando a posição de cada ação necessária.  Acho que vale a pena aos que se interessam sobre o assunto dar uma olhada. Abraços!
]]></description>
			<content:encoded><![CDATA[<p>Observando o grande número de acessos ao <a href="http://www.rodrigoaguas.com/blog/criando-relacionamentos-no-mysql/">artigo de criação de relacionamentos no MySQL</a>, resolvi dar uma melhorada nele acrescentando imagens das telas dos passos indicando a posição de cada ação necessária.  Acho que vale a pena aos que se interessam sobre o assunto dar uma olhada. Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rodrigoaguas.com/blog/atualizacao-do-passo-a-passo-de-como-criar-relacionamentos-no-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando relacionamentos no MySQL</title>
		<link>http://www.rodrigoaguas.com/blog/criando-relacionamentos-no-mysql/</link>
		<comments>http://www.rodrigoaguas.com/blog/criando-relacionamentos-no-mysql/#comments</comments>
		<pubDate>Wed, 10 Oct 2007 06:04:19 +0000</pubDate>
		<dc:creator>Rodrigo Aguas</dc:creator>
				<category><![CDATA[BD]]></category>

		<guid isPermaLink="false">http://www.rodrigoaguas.com/blog/criando-relacionamentos-no-mysql/</guid>
		<description><![CDATA[A janela de erro &#8220;MySQL error number 1005&#8243; fez eu perder a paciência um dia desses à noite enquanto tentava criar os relacionamentos em um banco de dados MySQL. Hoje, com mais calma, saí à procura da solução para o meu problema.
O problema era que eu estava criando um relacionamento com o mesmo nome dado [...]]]></description>
			<content:encoded><![CDATA[<p>A janela de erro &#8220;MySQL error number 1005&#8243; fez eu perder a paciência um dia desses à noite enquanto tentava criar os relacionamentos em um banco de dados MySQL. Hoje, com mais calma, saí à procura da solução para o meu problema.</p>
<p>O problema era que eu estava criando um relacionamento com o mesmo nome dado a outro relacionamento já existente, o que não pode ocorrer. Então, entendi o motivo para o próprio MySQL Query Browser sugerir nomes para os relacionamentos utilizando os nomes das tabelas que ele associa.</p>
<p>Aos que não entenderam do que estou falando ou não utilizam relacionamentos no MySQL, sugiro que aprendam e passem a usar. Relacionamento basicamente é fazer referência em uma tabela a uma entrada de outra tabela. Isso é feito criando uma coluna (ou um conjunto de colunas) que armazenará valores que fazem referência ao índice (ou conjunto de índices) da outra tabela com o objetivo de manter a integridade dos dados no banco de dados. A essa(s) coluna(s) se dá o nome de Foreign Key (ou chave estrangeira).</p>
<p>Abaixo, vou dar um passo-a-passo de como criar relacionamentos entre tabelas num banco de dados MySQL utilizando o MySQL Query Browser.</p>
<p>Já tendo conectado o MySQL Query Browser ao seu banco, clique com o botão direito do mouse na tabela que você fará o relacionamento e depois em &#8220;Edit Table&#8221; (Passo 1).</p>
<p><a title="Passo-a-passo para criar relacionamentos - Tela 1" href="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela1.gif" target="_blank"></a></p>
<p style="text-align: center"><a title="Passo-a-passo para criar relacionamentos - Tela 1" href="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela1.gif" target="_blank"><img title="Passo-a-passo para criar relacionamentos - Tela 1" src="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela1.thumbnail.gif" alt="Passo-a-passo para criar relacionamentos - Tela 1" hspace="5" vspace="5" /></a></p>
<p>Abrirá uma janela com diversas informações sobre a sua tabela, na parte inferior clique em &#8220;Foreign Keys&#8221; (Passo 2) e depois no sinal de adição (Passo 3). Então, digite o nome do relacionamento (lembre que apenas esse relacionamento poderá ter esse nome no banco de dados todo) e dê &#8220;OK&#8221; (Passo 4).</p>
<p><a title="Passo-a-passo como criar relacionamentos - Tela 2" href="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela2.gif" target="_blank"></a></p>
<p style="text-align: center"><a title="Passo-a-passo como criar relacionamentos - Tela 2" href="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela2.gif" target="_blank"><img title="Passo-a-passo como criar relacionamentos - Tela 2" src="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela2.thumbnail.gif" alt="Passo-a-passo como criar relacionamentos - Tela 2" align="middle" /></a><a title="Passo-a-passo para criar relacionamentos - Tela 3" href="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela3.gif" target="_blank"><img title="Passo-a-passo para criar relacionamentos - Tela 3" src="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela3.thumbnail.gif" alt="Passo-a-passo para criar relacionamentos - Tela 3" hspace="5" vspace="5" align="middle" /></a></p>
<p>Preencha &#8220;Ref. Table&#8221; com o nome da tabela de origem do índice (Passo 5). Na tabela onde tem &#8220;Column&#8221; e &#8220;Reference Column&#8221; dê um duplo-clique em cada célula de uma mesma linha e escreva o nome da coluna na tabela atual onde ficará armazenado o índice e o nome da coluna onde esse índice faz referência na outra tabela (Passo 6). Calma! Falta pouco, a melhor parte&#8230;</p>
<p><a title="Passo-a-passo para criar relacionamentos - Tela 4" href="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela4.gif" target="_blank"></a></p>
<p style="text-align: center"><a title="Passo-a-passo para criar relacionamentos - Tela 4" href="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela4.gif" target="_blank"><img src="http://www.rodrigoaguas.com/blog/wp-content/uploads/2008/01/tela4.thumbnail.gif" alt="Passo-a-passo para criar relacionamentos - Tela 4" /></a></p>
<p>Falta preencher os campos &#8220;On delete&#8221;  e &#8220;On update&#8221; (Passo 7). Os valores desses campos quem vai ter que saber é você, baseado nas regras de negócio e na implementação do sistema. Esses campos servem para indicar ao banco de dados qual atitude  tomar caso a entrada referenciada seja deletada ou atualizada, o que ocasionaria a quebra de integridade das informações do banco de dados. Para cada um desses campos o MySQL pode tomar 4 atitudes: cascade, restrict, no action ou set null.</p>
<p>Como o nome já diz, o CASCADE toma atitudes em cascata. Ou seja, se o item referenciado foi apagado, ele apaga também o item que fazia a referencia. Muito útil para casos em que a existência de um está essencialmente ligada à existência do outro.</p>
<p>Já o RESTRICT pode ser visto como o oposto do cascade, enquanto houver referencias à entrada que você deseja apagar, ela não poderá ser apagada. Você tem que acabar com todos os relacionamentos à ela para poder apagar o item referenciado.</p>
<p>Se você não usa relacionamentos, na hora em que apaga uma entrada, nada acontece a nenhuma outra que poderia ter referencia àquela, sem alterar nada no restante do banco de dados. É exatamente isso que o NO ACTION faz. Se um item referenciado é apagado ou atualizado, nada acontece além disso.</p>
<p>Em determinados casos não é interessante nem apagar os items que fazem referencia, nem impedir a exclusão e nem deixar que o banco de dados perca a integridade. Essa hora você pode usar o SET NULL, com ele quando o relacionamento for perdido, o valor de referencia é atualizado para null, fazendo com que você possa identificar tais casos e tratá-los.</p>
<p>Gostei muito quando aprendi a usar relacionamentos no MySQL, então tentei passar a diante. Abraços!</p>
<p>(Editado em 08/01/2008 &#8211; Acrescentado imagens)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rodrigoaguas.com/blog/criando-relacionamentos-no-mysql/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
