Ir para conteúdo

Arquivado

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

Visitante

Duplicata de chave primária (ID)

Recommended Posts

Visitante

- Bom, estou com esta simples problemática, tenho uma página que cria a tabela no banco de dados, até aqui OK.

- Esta bendita página Gera a tabela onde ele será inserido um registro inicial, mas, caso esta tabela exista com o registro 1 (por exemplo), simplesmente sobreponha com os dados que vem da página.

 

Basicamente isto:

 

INSERT INTO `tabela` (`id`, `nome`, `email`, `senha`, `nivel`, `data`) VALUES (1, 'Nome', 'admin@admin.com', 'd033e22ae348aeb5660fc2140aec35850c4da997', '100', '2015-01-01 00:00:00')

Caso a tabela exista ele deve sobrepor o ID "1" com estes dados

Alguém se habilita?

 

Quando atualizo sabendo que a tabela existe, ele me retorna:

Duplicate entry '1' for key 'PRIMARY'

Compartilhar este post


Link para o post
Compartilhar em outros sites

O MySQL suporta REPLACE e INSERT INTO ... ON DUPLICATE.

O primeiro, efetua um delete e depois insere o registro.

O segundo, tenta inserir, se não conseguir (por conta das chaves primárias que duplicariam) ele faz um update nos campos necessários.

A vantagem destes dois é que você tem que fazer uma consulta a menos para ver se existe ou não.

Se sua tabela não tem FK, usaria REPLACE. Se tiver, INSERT INTO ... ON DUPLICATE ...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

Bom seria isso o caso:

if(      se não existir a tabela       ){
    // 1 - cria a tabela
    // 2 - insere o registro
}else{
    // 1 - caso exista a tabela
    // 2 - ou remove o registro e cria/atualiza os dados do id = 1 (exemplo)
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, se com "atualizar os dados" você quer dizer que a PRIMARY KEY/UNIQUE INDEX servirão de critério, tanto REPLACE como INSERT INTO ... ON DUPLICATE KEY UPDATE. Vamos a um exemplo:

CREATE TABLE teste (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  tipo VARCHAR(5) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

REPLACE INTO teste VALUES (1, 'Velho', '2014-08-20 18:47:00');

O REPLACE tenta inserir o registro, se não falhar por causa da PK ou UNIQUE INDEX, ele insere normalmente.

REPLACE INTO teste VALUES (1, 'Novo', '2014-08-20 18:47:42');

Agora como o ID 1 já existe, ocorre erro por causa da PK, mas mesmo assim será atualizado gerando o aviso "Query OK, 2 rows affected (0.04 sec)". O que aconteceu:

  1. Ocorreu um erro por causa da PK/UNIQUE INDEX;
  2. DELETE no registro com PK/UNIQUE INDEX existente (primeira linha afetada);
  3. INSERE o registro com os dados atualizados (segunda linha afetada).

 

 

Mas também podemos fazer com INSERT INTO ... ON DUPLICATE KEY

INSERT INTO teste VALUES (1, 'Novo', '2014-08-20 18:47:42')
ON DUPLICATE KEY UPDATE
  tipo = VALUES(tipo),
  ts = VALUES(ts);

Desta forma, o registro será inserido, ou se houver duplicidade do registro (erro PK/UNIQUE INDEX), ele só atualiza os campos passados pela SQL.

 

 

Basicamente é a mesma coisa que todo mundo disse...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma informação importante, como já citei anteriormente:

 

Se tiver FK que faz referência a esta PK, REPLACE não é recomendado porque ele faz um DELETE antes!

Nos comentários do link tem gente falando sobre isso também.

 

Se tiver FK, recomendo o INSERT INTO ... ON DUPLICATE

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.