Ir para conteúdo

POWERED BY:

Arquivado

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

r.vinicius

Relacionamento de tabelas em Mysql 1:1 e 1:n

Recommended Posts

Boa tarde galera!

Então, tava estudando um pouco de mysql, e fiquei em duvida em relacionamento de tabelas.

 

Como diferenciar uma relação de 1:1 e 1:n.

 

 

Criei essas duas relações usando o diagrama do workbench, e depois dei um forward engineer para analisar o código, e não notei nenhuma diferença entre as duas relações.

 

Relação de 1:1

-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`pessoa` (
  `pessoa` INT NOT NULL AUTO_INCREMENT,
  `nome` VARCHAR(45) NULL,
  PRIMARY KEY (`pessoa`))
ENGINE = InnoDB;




-- -----------------------------------------------------
-- Table `mydb`.`documento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`documento` (
  `iddocumento` INT NOT NULL AUTO_INCREMENT,
  `numerodoc` VARCHAR(45) NULL,
  `pessoa_pessoa` INT NOT NULL,
  PRIMARY KEY (`iddocumento`),
  INDEX `fk_documento_pessoa_idx` (`pessoa_pessoa` ASC),
  CONSTRAINT `fk_documento_pessoa`
    FOREIGN KEY (`pessoa_pessoa`)
    REFERENCES `mydb`.`pessoa` (`pessoa`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Relação de 1:n

CREATE TABLE IF NOT EXISTS `mydb`.`animal` (
  `idanimal` INT NOT NULL AUTO_INCREMENT,
  `nome` VARCHAR(45) NULL,
  PRIMARY KEY (`idanimal`))
ENGINE = InnoDB;




-- -----------------------------------------------------
-- Table `mydb`.`cartao`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`cartao` (
  `idcartao` INT NOT NULL AUTO_INCREMENT,
  `numcartao` VARCHAR(45) NULL,
  `animal_idanimal` INT NOT NULL,
  PRIMARY KEY (`idcartao`),
  INDEX `fk_cartao_animal1_idx` (`animal_idanimal` ASC),
  CONSTRAINT `fk_cartao_animal1`
    FOREIGN KEY (`animal_idanimal`)
    REFERENCES `mydb`.`animal` (`idanimal`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nos dois exemplos, tanto animal como pessoa podem ter mais de 1 relacionamento.

INSERT INTO pessoa VALUES (1000, 'lokaodomau');
# id 1000 porque não sei até onde vão seus testes

INSERT INTO documento (numerodoc, pessoa_pessoa) VALUES
('exemplo 1', 1000),
('exemplo 2', 1000);
# Campo VARCHAR para diferentes modelos de documento?

Agora vou criar uma nova tabela.

CREATE TABLE documento_pessoa_unica LIKE documento;

ALTER TABLE documento_pessoa (
  UNIQUE INDEX fk_documento_pessoa_unica_idx (pessoa_pessoa ASC)
  CONSTRAINT fk_documento_pessoa_unica
    FOREIGN KEY (pessoa_pessoa)
    REFERENCES pessoa (pessoa)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
);

Agora vamos tentar inserir os mesmos documentos na nova tabela.

INSERT INTO documento (numerodoc, pessoa_pessoa) VALUES ('exemplo 1', 1000); # insere
INSERT INTO documento (numerodoc, pessoa_pessoa) VALUES ('exemplo 2', 1000); # erro

Ocorre erro por causa do UNIQUE INDEX que existe no campo `pessoa_pessoa` da nova tabela.

 

 

Obs: fiz tudo na teoria, espero que não de erro, hehehe.

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.