Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Valor duplicado com PRIMARY KEY


RodrigoGomes

Question

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 to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...