Data como PK
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.
Curtidas 0
Respostas
Anthony Accioly
29/03/2011
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?
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?
GOSTEI 0
Marcelo Itapirema.
29/03/2011
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!
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!
GOSTEI 0
Anthony Accioly
29/03/2011
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:
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,
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,
GOSTEI 0
Marcelo Itapirema.
29/03/2011
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!
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!
GOSTEI 0
Anthony Accioly
29/03/2011
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,
Abraços,
GOSTEI 0
Carlos Mazzi
29/03/2011
Deu certo amigao?
GOSTEI 0
Marcelo Itapirema.
29/03/2011
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!
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!
GOSTEI 0
Anthony Accioly
29/03/2011
Oi Marcelo,
Dá uma olhada aqui: http://dev.mysql.com/doc/refman/4.1/pt/mysqldump.html
Basicamente: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,
Dá uma olhada aqui: http://dev.mysql.com/doc/refman/4.1/pt/mysqldump.html
Basicamente:
mysqldump nome_do_banco > schema.sql
Abraços,
GOSTEI 0
Marcelo Itapirema.
29/03/2011
Oi Anthony,
Consegui usar mysqldump, obrigado pelas dicas!
Segue o script que ele criou:
Grato pela atenção!
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!
GOSTEI 0
Anthony Accioly
29/03/2011
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,
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,
GOSTEI 0
Marcelo Itapirema.
29/03/2011
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.
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 */;
GOSTEI 0