Arquivos da categoria: BD

Criação de Tabelas e Relacionamentos com SQL

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 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 MySQL Query Browser, o phpMyAdmin ou outro programa de sua preferência que permita a execução de códigos SQL na base de dados.

Basearei minhas explicações em exemplos para a criação de um banco de dados para uma “biblioteca” (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:

CREATE TABLE autor (
id INT,
nome VARCHAR
)

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).

CREATE TABLE autor (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR NOT NULL
)

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.

CREATE TABLE livro (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
isbn INT NOT NULL,
titulo VARCHAR NOT NULL,
edicao INT NOT NULL
)

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).

CREATE TABLE livro (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
isbn INT NOT NULL UNIQUE,
titulo VARCHAR NOT NULL,
edicao INT NOT NULL,
autor INT NOT NULL
CONSTRAINT fk_autor FOREIGN KEY (id) REFERENCES autor(id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
engine = InnoDB

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.

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 documentação do MySQL.

Espero ter respondido aos pedidos feitos nos comentários do outro artigo. Abraços!

Criando relacionamentos no MySQL

A janela de erro “MySQL error number 1005” 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 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.

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).

Abaixo, vou dar um passo-a-passo de como criar relacionamentos entre tabelas num banco de dados MySQL utilizando o MySQL Query Browser.

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 “Edit Table” (Passo 1).

Passo-a-passo para criar relacionamentos - Tela 1

Abrirá uma janela com diversas informações sobre a sua tabela, na parte inferior clique em “Foreign Keys” (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ê “OK” (Passo 4).

Passo-a-passo como criar relacionamentos - Tela 2Passo-a-passo para criar relacionamentos - Tela 3

Preencha “Ref. Table” com o nome da tabela de origem do índice (Passo 5). Na tabela onde tem “Column” e “Reference Column” 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…

Passo-a-passo para criar relacionamentos - Tela 4

Falta preencher os campos “On delete” e “On update” (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.

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.

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.

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.

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.

Gostei muito quando aprendi a usar relacionamentos no MySQL, então tentei passar a diante. Abraços!

(Editado em 08/01/2008 – Acrescentado imagens)