[RESOLVIDO]Chave composta MySQL

3 respostas
P
Olá pessoal. Bom, não sei se estou no fórum correto, pensei em postar no Persistência: Hibernate, JPA, JDBC e outros mas, acho q é aqui mesmo. Seguinte. Tenho uma tabela que estou tentando criar porém dá erro no Workbench MySQL. Nessa tabela quero criar 2 colunas que são PK e FK e uma outra q "é dela mesmo", ou seja, cada coluna q estou definindo como PK é o sequence de outras tabelas. Tenho a tabA e a tabB e estou tentano criar a pontuacao_tabA_tabB que contém o id(sequence) de cada uma delas. Acho q com o código vcs vão entender o que digo:
CREATE  TABLE `aulaPKFK`.`pontuacao_tabA_tabB` (

  `idtabA` INT NOT NULL ,

  `idtabB` INT NOT NULL ,

  `ptTotal` VARCHAR(45) NOT NULL ,

  PRIMARY KEY (`idtabA`, `idtabB`) ,

  INDEX `fk_idtabA_idx` (`idtabA` ASC) ,

  INDEX `fk_idtabB_idx` (`idtabB` ASC) ,

  CONSTRAINT `fk_idtabA`

    FOREIGN KEY (`idtabA` )

    REFERENCES `aulaPKFK`.`tabA` (`idtabA` )

    ON DELETE CASCADE

    ON UPDATE CASCADE,

  CONSTRAINT `fk_idtabB`

    FOREIGN KEY (`idtabB` )

    REFERENCES `aulaPKFK`.`tabB` (`idtabB` )

    ON DELETE CASCADE

    ON UPDATE CASCADE)

ENGINE = InnoDB;
O erro é simplesmente isso que aparece
ERROR 1005: Can't create table 'aulaPKFK.pontuacao_tabA_tabB' (errno: 121)

3 Respostas

ribclauport

Dê uma olhada nas outras tabelas, se as constraints não estão com o mesmo nome, ou se as chaves tem o mesmo nome, veja esse erro siginifica:

MySQL error code 121: Duplicate key on write or update

Ou seja, ele esta dizendo que existe uma chave duplicada

ribclauport

Rodei os fontes abaixo no mesmo ambiente que o seu e funcionou normalmente segue:

'CREATE TABLE `taba` (
  `idtabA` int(11) NOT NULL,
  `descA` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idtabA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

'CREATE TABLE `tabb` (
  `idtabb` int(11) NOT NULL,
  `descB` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idtabb`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

'CREATE TABLE `pontuacao_taba_tabb` (
  `idtabA` int(11) NOT NULL,
  `idtabB` int(11) NOT NULL,
  `ptTotal` varchar(45) NOT NULL,
  PRIMARY KEY (`idtabA`,`idtabB`),
  KEY `fk_idtabA_idx` (`idtabA`),
  KEY `fk_idtabB_idx` (`idtabB`),
  CONSTRAINT `fk_idtabA` FOREIGN KEY (`idtabA`) REFERENCES `taba` (`idtabA`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_idtabB` FOREIGN KEY (`idtabB`) REFERENCES `tabb` (`idtabb`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1'
P
ribclauport:
Rodei os fontes abaixo no mesmo ambiente que o seu e funcionou normalmente segue:
'CREATE TABLE `taba` (
  `idtabA` int(11) NOT NULL,
  `descA` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idtabA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

'CREATE TABLE `tabb` (
  `idtabb` int(11) NOT NULL,
  `descB` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idtabb`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

'CREATE TABLE `pontuacao_taba_tabb` (
  `idtabA` int(11) NOT NULL,
  `idtabB` int(11) NOT NULL,
  `ptTotal` varchar(45) NOT NULL,
  PRIMARY KEY (`idtabA`,`idtabB`),
  KEY `fk_idtabA_idx` (`idtabA`),
  KEY `fk_idtabB_idx` (`idtabB`),
  CONSTRAINT `fk_idtabA` FOREIGN KEY (`idtabA`) REFERENCES `taba` (`idtabA`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_idtabB` FOREIGN KEY (`idtabB`) REFERENCES `tabb` (`idtabb`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

Obrigado ribclauport, É isso mesmo que você disse. Eu criei as tabelas novamente e padronizei os nomes das constraint, index, fk e pk pelo padrão SQL que pesquisei na internet. Eu também criei uma tabela, somente depois de criada que adicionei as FK, uma de cada vez e rodou.

Criado 24 de novembro de 2012
Ultima resposta 3 de dez. de 2012
Respostas 3
Participantes 2