Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Valor duplicado com PRIMARY KEY


RodrigoGomes

Pergunta

Tenho as seguintes tabelas:

-- Table "usuarios" DDL

CREATE TABLE `usuarios` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `login` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `senha` varchar(100) COLLATE utf8_bin NOT NULL,
  `registro` tinyint(1) NOT NULL,
  `confirmacao` bigint(30) NOT NULL,
  `data` date NOT NULL,
  `ip` varchar(100) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`,`login`,`email`)
) ENGINE=MyISAM AUTO_INCREMENT=20798 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

E por algum motivo ela esta inserindo campos duplicados em "login" e "email" sem retornar erro algum, mesmo sendo "PRIMARY KEY".

Alguém sabe o que isso pode ser?

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0
Tenho as seguintes tabelas:

...

E por algum motivo ela esta inserindo campos duplicados em "login" e "email" sem retornar erro algum, mesmo sendo "PRIMARY KEY".

Alguém sabe o que isso pode ser?

Claro que sim.

O conjunto (`id`,`login`,`email`) é a chave primária. Então (1, a, a) é uma chave valida sem repetição e (2,a,a) também é uma chave válida sem repetição.

Sua chave primária deveria ser (`id`) e você deveria te uma chave UNIQUE para (`login`).

Com este indice único você garantirá que haverá somente um login para cada registro na tabela.

Entenda chave primária exclusivamente como a chave que liga uma tabela a outra tabela

Link para o comentário
Compartilhar em outros sites

  • 0

desta forma está correta?

-- Table "usuarios" DDL

CREATE TABLE `usuarios` (

`id` int(20) NOT NULL AUTO_INCREMENT,

`login` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

`email` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

`senha` varchar(100) COLLATE utf8_bin NOT NULL,

`registro` tinyint(1) NOT NULL,

`confirmacao` bigint(30) NOT NULL,

`data` date NOT NULL,

`ip` varchar(100) COLLATE utf8_bin NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `unique` (`login`,`email`)

) ENGINE=MyISAM AUTO_INCREMENT=20916 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Agradeço a ajuda!

Link para o comentário
Compartilhar em outros sites

  • 0
desta forma está correta?

Se a chave única do login ficar do jeito que está entãovocêpoderáter registros assim:

(login1,email1) será uma chave única e (login1,email2) também será uma chave única ou

(login1,email1) será uma chave única e (login2,email1) também será uma chave única.

Se seu objetivo é que exista somente um login para cada usuário, o script alterado abaixo é mais indicado

CREATE TABLE `usuarios` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `login` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `senha` varchar(100) COLLATE utf8_bin NOT NULL,
  `registro` tinyint(1) NOT NULL,
  `confirmacao` bigint(30) NOT NULL,
  `data` date NOT NULL,
  `ip` varchar(100) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`login`)
) ENGINE=MyISAM AUTO_INCREMENT=20916 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Link para o comentário
Compartilhar em outros sites

  • 0

desta forma não funciona como quero?

CREATE TABLE `usuarios` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `login` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `senha` varchar(100) COLLATE utf8_bin NOT NULL,
  `registro` tinyint(1) NOT NULL,
  `confirmacao` bigint(30) NOT NULL,
  `data` date NOT NULL,
  `ip` varchar(100) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `login` (`login`),
  UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=20986 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Link para o comentário
Compartilhar em outros sites

  • 0
desta forma não funciona como quero?

Desta forma você terá um único usuário e um único email dentro do sistema. Ou seja um segundo usuário não poderá usar um email já existente assim como não poderão haver dois usuários iguais. se é isto que você quer então esta é o código correto.

(Uma dica: Sempre que trabalhar com bancos de dados lembre-se das aulas de teoria de conjuntos que você aprendeu no 1º e 2º graus. "par ordenado" são os indices compostos; "interseção, união, diferença de conjuntos" são os relacionamentos de join, left join, union, etc.)

Link para o comentário
Compartilhar em outros sites

  • 0
desta forma não funciona como quero?

Desta forma você terá um único usuário e um único email dentro do sistema. Ou seja um segundo usuário não poderá usar um email já existente assim como não poderão haver dois usuários iguais. se é isto que você quer então esta é o código correto.

(Uma dica: Sempre que trabalhar com bancos de dados lembre-se das aulas de teoria de conjuntos que você aprendeu no 1º e 2º graus. "par ordenado" são os indices compostos; "interseção, união, diferença de conjuntos" são os relacionamentos de join, left join, union, etc.)

Sim, é assim mesmo que quero.

Agora entendo como funciona, obrigado!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...