Вы находитесь на странице: 1из 2

Implementando Integridade Referencial no MySQL No artigo "Trabalhando com os vrios tipos de tabelas do MySQL", vimos que no MySQL possvel

l escolher o formato de armazenamento da tabela no momento da sua criao, o que d a flexibilidade de optar por um ou outro tipo de tabela, dependendo do tipo de aplicao a ser desenvolvida. Existem determinados recursos do SGBD (Sistema Gerenciador de Banco de Dados) que esto diretamente relacionados ao tipo de tabela escolhido, tais como, controle de transao, nveis de lock e integridade referencial. Neste artigo vamos exemplificar como definir regras de integridades no MySQL. Para trabalharmos com integridade referencial, isto , para adicionarmos restries de integridade (constraints) s chaves estrangeiras, necessrio criar as tabelas como InnoDB. Este recurso est disponvel somente para este tipo de tabela, embora seja possvel definir chaves estrangeiras e restries outros tipos de tabelas por razes de compatibilidade. O detalhe que neste caso, estas definies tero o efeito apenas de documentao, ou seja, o MySQL no respeitar os constraints definidos. O InnoDB implementa as restries de integridade CASCADE, RESTRICT, SET NULL e SET DEFAULT. No primeiro caso, ao se remover um registro da tabela referenciada pela chave estrangeira os registros relacionados quele removido sero eliminados em todas as tabelas relacionadas. O RESTRICT no permite a remoo de registros que possuam relacionamentos em outras tabelas. Os dois ltimos atribuem os valores DEFAULT ou NULL para as chaves estrangeiras cujos registros relacionados foram excludos. O exemplo abaixo ilustra algumas tabelas que utilizam regras de integridade: CREATE TABLE aluno ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, nome CHAR(30) NOT NULL ) TYPE=InnoDB; CREATE TABLE cursos ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, nome CHAR(30) NOT NULL ) TYPE=InnoDB; CREATE TABLE notas ( aluno_id INT NOT NULL, cursos_id INT NOT NULL, date DATE NOT NULL, nota DOUBLE NOT NULL, PRIMARY KEY(aluno_id, cursos_id, date), INDEX i2 (cursos_id), FOREIGN KEY (aluno_id) REFERENCES aluno(id) ON DELETE CASCADE, FOREIGN KEY (cursos_id) REFERENCES cursos(id) ON DELETE RESTRICT ) TYPE=InnoDB;

No exemplo existem 3 tabelas: aluno, que armazena os alunos de uma faculdade; a tabela cursos que contm as disciplinas ministradas e a tabela notas com os pontos dos alunos em todos os cursos freqentados por eles. No modelo possvel que um curso possua vrias avaliaes em datas distintas. Neste caso, foram criadas as tabelas como tipo InnoDB (TYPE=InnoDB), para que as regras de integridade sejam respeitadas. As regras definidas foram: um CASCADE para aluno, isto , se for removido um registro da tabela de aluno, todas as suas notas sero removidas automaticamente. No caso da tabela de cursos, no ser possvel remover um curso que possua notas cadastradas para ele. Alm da restrio ON DELETE, o InnoDB permite tambm o ON UPDATE, que aplica as restries no caso de atualizaes dos campos ralacionados entre as tabelas. importante ressaltar que o FOREIGN KEY no cria automaticamente um ndice na(s) coluna(s) referenciada(s). Assim, necessrio criar explicitamente um ndice nas colunas que sero chaves estrangeiras. No exemplo, a coluna aluno_id j um ndice, visto que esta o primeiro campo da chave primria da tabela. Como cursos_id no o primeiro campo de nenhuma chave, foi adicionado o ndice i2 para esta chave estrangeira. Caso no seja criado o ndice nas chaves estrangeiras, o MySQL exibir o erro "ERROR 1005: Can't create table './test/notas.frm' (errno: 150)", onde o erro significa que h uma definio incorreta das chaves estrangeiras.

Вам также может понравиться