Fórum Data como PK #398396

29/03/2011

0

Olá, Li um artigo em que o autor usa data como pk, depois na normalização essa data também vai para outra tabela como fk. Tentei fazer isso no MySQL mas ele não aceita, alguém sabe por quê não aceita?
Marcelo Itapirema.

Marcelo Itapirema.

Responder

Posts

31/03/2011

Anthony Accioly

Opa Marcelo,
Deveria aceitar sim. Apesar de, como todo lobo velho de web, eu preferir ter um ID numérico com AUTO_INCREMENT e um índice no campo DATETIME. Tem uma série de complicações em usar campos temporais como primary key, entre eles, fuso-horário, precisão, etc. (De uma olhada nesse artigo http://billauer.co.il/blog/2009/03/mysql-datetime-epoch-unix-time/).
Cola o código SQL aí para que eu possa dar uma olhada.ps: Você está usando a engine InnoDB? Está tendo problemas em criar a primary key ou a foreign key?
Responder

Gostei + 0

31/03/2011

Marcelo Itapirema.

Oi Anthony,

Estou usando InnoDB. Criei as tabelas pelo Query Browser mesmo para fins didáticos, segue a query.

ALTER TABLE `gerente`.`tbl_item_emprestimo` ADD CONSTRAINT `FK_tbl_item_emprestimo_1` FOREIGN KEY `FK_tbl_item_emprestimo_1` (`DT_emprestimo`)
    REFERENCES `tbl_emprestimo` (`DT_emprestimo`)
    ON DELETE CASCADE
    ON UPDATE CASCADE

Retorna esse erro: MySQL Error Number 1005

A estrutura é essa:


Emprestimo (CODEMP_cliente, CODEMP_Acevo, DT_Emprestimo, DT_Devolucao)
Item_Emprestimo (CODEMP_Acervo, DT_Emprestimo)

O artigo que eu sigo esta nesse endereço:

https://www.devmedia.com.br/articles/post-7146-Artigo-SQL-Magazine-6-Projeto-de-Banco-Dados-parte-V--Modelo-Fisico.html


Grato pela ajuda!
Responder

Gostei + 0

07/04/2011

Anthony Accioly

Marcelo,

Desculpe pela demora.
Acho que o problema está na sintaxe de criação da foreign key (você está repetindo o nome duas vezes).
O `gerente` é seu schema?

Tenta o seguinte:
ALTER
 TABLE `gerente`.`tbl_item_emprestimo` 
ADD CONSTRAINT 
`FK_tbl_item_emprestimo_1` FOREIGN KEY  
(`DT_emprestimo`)
    REFERENCES `gerente`.`tbl_emprestimo` (`DT_emprestimo`)
    ON DELETE CASCADE
    ON UPDATE CASCADE;


Se não der certo tenta sem a declaração do schema `gerente`, se também não der certo cola para mim o SQL das tabelas.

Abraços,

Responder

Gostei + 0

23/04/2011

Marcelo Itapirema.

Oi Anthony,

Agora eu que pesso desculpa pela demora.

Testei como você sugeriu, mas retornou o seguinte erro:


Can't create table '.\gerente\#sql-65c_10.frm' (errno: 150)  Erro 1005


Talvez seja a forma como criei o banco. Percebi que usando a data como FK não funcionaria e reformulei o modelo.


Mas mesmo assim agradeço imensamente pela ajuda!


Abraço!
Responder

Gostei + 0

24/04/2011

Anthony Accioly

O que deveria ser o `gerente`, um schema? Tenta executar o mesmo comando sem ele.Se não der ceto cola o DDL das tabelas aqui que a gente descobre rapidinho (você saber usar o mysqldump?).
Abraços,
Responder

Gostei + 0

26/04/2011

Carlos Mazzi

Deu certo amigao?
Responder

Gostei + 0

26/04/2011

Marcelo Itapirema.

Olá,

Tentei remover o nome do schema como o sugerido mas continua o erro.

o nome do schema é kanririn que significa gerente, é um sistema para controle de coleção de HQs e Livros. Tentei facilitar usando a tradução, mas nos teste garanto que tive o cuidado de usar o nome original.

Como consigo obter a ddl das tabelas? não conheço o mysqldumps.

Peço perdão pelo amadorismo,  mas estou estudando BD e criei esse schema adaptando um artigo com uma ideia própia para aprender na prática os conceitos.


Grato pela atenção e ajuda!


Responder

Gostei + 0

27/04/2011

Anthony Accioly

Oi Marcelo,
Dá uma olhada aqui: http://dev.mysql.com/doc/refman/4.1/pt/mysqldump.html
Basicamente:
    mysqldump nome_do_banco > schema.sql
Isso vai gerar um script com tudo que tem no seu banco.Você deve executar esse comando no shell no linux (ou cmd do Windows). Se, no caso do Windows, o mysqldump não estiver no seu PATH procure pelo executável na pastade instalação no MySQL.
Abraços,
Responder

Gostei + 0

08/05/2011

Marcelo Itapirema.

Oi Anthony,

Consegui usar mysqldump, obrigado pelas dicas!

Segue o script que ele criou:

-- MySQL dump 10.10
--
-- Host: localhost    Database: kanririn
-- ------------------------------------------------------
-- Server version    5.0.15-nt

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table `tbl_item_emprestimo`
--


/*!40000 ALTER TABLE `tbl_item_emprestimo` DISABLE KEYS */;
LOCK TABLES `tbl_item_emprestimo` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `tbl_item_emprestimo` ENABLE KEYS */;

--
-- Dumping data for table `tbl_emprestimo`
--


/*!40000 ALTER TABLE `tbl_emprestimo` DISABLE KEYS */;
LOCK TABLES `tbl_emprestimo` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `tbl_emprestimo` ENABLE KEYS */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;



Grato pela atenção!
Responder

Gostei + 0

09/05/2011

Anthony Accioly

Opa, 
Só que faltou as tabelas :D. 
Acho que você passou alguma opção para o mysqldump: Veja a sintaxe aqui:
http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html
Abraços, 
Responder

Gostei + 0

01/06/2011

Marcelo Itapirema.

Anthony, perdão pela demora. Sei que eu to precisando e agradeço toda ajuda. Passei um tempo ausente mas agora vou manter o foco no estudo.

Desculpa a trapalhada...seguem as tabelas de fato, para não ocupar muito a tela e seu tempo, postei apenas as tabelas que fazem parte do problema, mas caso precise eu posto as outras também e sem demora.


-- MySQL dump 10.10
--
-- Host: localhost    Database: kanririn
-- ------------------------------------------------------
-- Server version    5.0.15-nt

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


--
-- Table structure for table `tbl_emprestimo`
--

DROP TABLE IF EXISTS `tbl_emprestimo`;
CREATE TABLE `tbl_emprestimo` (
  `COD_amigo` int(11) NOT NULL default '0',
  `DT_emprestimo` date NOT NULL,
  `DT_devolucao` date default NULL,
  PRIMARY KEY  USING BTREE (`COD_amigo`,`DT_emprestimo`),
  CONSTRAINT `tbl_emprestimo_ibfk_1` FOREIGN KEY (`COD_amigo`) REFERENCES `tbl_amigo` (`COD_amigo`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `tbl_emprestimo`
--


/*!40000 ALTER TABLE `tbl_emprestimo` DISABLE KEYS */;
LOCK TABLES `tbl_emprestimo` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `tbl_emprestimo` ENABLE KEYS */;


--
-- Table structure for table `tbl_item_emprestimo`
--

DROP TABLE IF EXISTS `tbl_item_emprestimo`;
CREATE TABLE `tbl_item_emprestimo` (
  `CODEMP_amigo` int(11) NOT NULL default '0',
  `COD_acervo` int(11) NOT NULL,
  `DT_emprestimo` datetime NOT NULL,
  PRIMARY KEY  USING BTREE (`CODEMP_amigo`,`COD_acervo`,`DT_emprestimo`),
  KEY `FK_tbl_item_emprestimo_2` (`COD_acervo`),
  CONSTRAINT `FK_tbl_item_emprestimo_1` FOREIGN KEY (`CODEMP_amigo`) REFERENCES `tbl_emprestimo` (`COD_amigo`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_tbl_item_emprestimo_2` FOREIGN KEY (`COD_acervo`) REFERENCES `tbl_acervo` (`COD_acervo`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `tbl_item_emprestimo`
--


/*!40000 ALTER TABLE `tbl_item_emprestimo` DISABLE KEYS */;
LOCK TABLES `tbl_item_emprestimo` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `tbl_item_emprestimo` ENABLE KEYS */;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar