Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

alex.mata

Integridade Referencial com Fk não funcionam

Recommended Posts

Tabela usuarios (passa o codigo como chave estrangeira para a tabela compradores):

CREATE TABLE USUARIOS
 (CODIGO INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,NOME VARCHAR(50) NOT NULL
 ,USERID VARCHAR(12) NOT NULL UNIQUE
 ,PSWD VARCHAR(240) NOT NULL
 ,TIPO INT(2)NOT NULL
 ,GRU_CODIGO INT(5) NOT NULL
 );

tabela COMPRADORES(Recebe o codigo do usuario no campo USU_CODIGO):

CREATE TABLE COMPRADORES
 (NOME VARCHAR(50) NOT NULL
 ,EMAIL VARCHAR(100) NOT NULL
 ,RUA VARCHAR(200) NOT NULL
 ,NUMERO INT(6) NOT NULL
 ,BAIRRO VARCHAR(100) NOT NULL
 ,CIDADE VARCHAR(50) NOT NULL
 ,CEP VARCHAR(10) NOT NULL
 ,UF VARCHAR(2) NOT NULL
 ,PAIS VARCHAR(50) NOT NULL
 ,DATADENASCIMENTO DATE NOT NULL
 ,CODIGO INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,RG VARCHAR(14) NOT NULL
 ,CPF INT(11) NOT NULL
 ,TELEFONE VARCHAR(20)
 ,CON_CODIGO INT(5) NOT NULL
 ,USU_CODIGO INT(5) NOT NULL
 );

tabela CONTRATOS que passa o codigo como chave estrangeira para a tabela COMPRADORES campo CON_CODIGO:

CREATE TABLE CONTRATOS
 (TITULO VARCHAR(50)
 ,CONTRATO VARCHAR(2000) NOT NULL
 ,CODIGO INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY
 );

as FKs:

ALTER TABLE COMPRADORES ADD CONSTRAINT
 COM_CON_FK FOREIGN KEY 
  (CON_CODIGO) REFERENCES CONTRATOS
  (CODIGO);

ALTER TABLE COMPRADORES ADD CONSTRAINT
 COM_USU_FK FOREIGN KEY 
  (USU_CODIGO) REFERENCES USUARIOS
  (CODIGO);

mesmo com a tabela USUARIOS e CONTRATOS vazias, eu fiz um insert com dados fixos e ele inseriu como se as fks existissem! mas as tabelas das fks estao vazias! ou seja a integridade referencial nao esta funcionando... alguem pode me ajudar!?!?!?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, o que pode estar acontecendo é que você está criando a tabela como MyISAM. O MySQL não dá erro quando você tenta criar FK numa tabela que é MyISAM, por isso pode parecer que está tudo OK pra você.

 

Antes do ';' em cada CREATE TABLE, adicione: ENGINE=InnoDB

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, o que pode estar acontecendo é que você está criando a tabela como MyISAM. O MySQL não dá erro quando você tenta criar FK numa tabela que é MyISAM, por isso pode parecer que está tudo OK pra você.

 

Antes do ';' em cada CREATE TABLE, adicione: ENGINE=InnoDB

 

O servidor de bancos de dados MySQL é "orientado" aos seus motores de armazenamento que são so Storage Engines (por isso ele é considerado um plugable database), estes que tem as suas próprias características e suportam ou não a integridade referencial como outras como transações, merge-index, gis... Bom, no seu caso, o Eclesiastes está certo, mas, quero acrescentar que o MyISAM não suporta integridade referencial, para restringir a exclusão ou atualizações de registros relacionados, ou mesmo efetuar operações como CASCADE, SET NULL e SET DEFAULT, ou seja, não é uma característica deste motor de armazenamento. Se você quiser utilizar o InnoDB, você terá tal característica disponível para utilização.

 

Para te dar mais tranquilidade na hora de criar tabelas em sua sessão, você poderá setar a variável de ambiente para InnoDB, não precisando abordar em todo CREATE TABLE a declaração ENGINE=blá, desta forma:

 

mysql> select @@storage_engine;
+------------------+
| @@storage_engine |
+------------------+
| MyISAM           |
+------------------+
1 row in set (0.00 sec)

mysql> set storage_engine=InnoDB;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@storage_engine;
+------------------+
| @@storage_engine |
+------------------+
| InnoDB           |
+------------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE test.tabmasters (a int);
Query OK, 0 rows affected (0.11 sec)

mysql> show create table test.tabmasters;
+------------+-------------------------------
| Table      | Create Table
+------------+-------------------------------
| tabmasters | CREATE TABLE `tabmasters` (
  `a` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+------------+-------------------------------
1 row in set (0.00 sec)

Happy MySQL'ing! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.