Desejo adicionar uma linha a uma tabela de banco de dados, mas se existir uma linha com a mesma chave exclusiva, desejo atualizar a linha.
Por exemplo:
insert into table (id, name, age) values(1, "A", 19)
Digamos que a chave exclusiva seja id
e, no meu banco de dados , há uma linha com id = 1
. Nesse caso, quero atualizar essa linha com esses valores. Normalmente, isso gera um erro.
Se eu usar, insert IGNORE
ele ignorará o erro, mas ainda não será atualizado.
mysql
sql
insert-update
upsert
Keshan
fonte
fonte
Respostas:
Usar
INSERT ... ON DUPLICATE KEY UPDATE
INQUERIR:
fonte
affected row count
resulta2
quando atualizar com êxito (em chave duplicada) linha única? Alguém mais teve esse resultado? (Os dados são atualizados corretamente: ou seja, apenas 1 linha é atualizada)ON DUPLICATE KEY UPDATE
aumentam as linhas afetadas em 2. Ele informa 0 se nada é realmente atualizado (o mesmo que o normalUPDATE
).Confira REPLACE
http://dev.mysql.com/doc/refman/5.0/en/replace.html
fonte
Ao usar a inserção em lote, use a seguinte sintaxe:
fonte
VALUES(name)
não funcionar, você pode tentarname = 'name_value',...;
Tente isto:
Espero que isto ajude.
fonte
Tente o seguinte:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
Nota:
Aqui, se id for a chave primária, após a primeira inserção,
id='1'
sempre que a tentativa de inserçãoid='1'
atualizar o nome e a idade, o nome anterior mudará.fonte
Todas essas soluções funcionarão em relação à sua pergunta.
Se você quiser saber detalhes sobre essas declarações, visite este link
fonte
REPLACE
não está documentado no documento vinculado.Ao usar o SQLite:
Desde que
id
seja a chave primária. Ou então, apenas insere outra linha. Consulte INSERIR (SQLite).fonte
replace into
faz é exatamente "inserir ou atualizar quando existente". @OwlCREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
Só porque eu estava aqui procurando esta solução, mas atualizando de outra tabela estruturada de forma idêntica (no meu caso, teste o banco de dados para o banco de dados ativo):
Como mencionado em outro lugar, somente as colunas que você deseja atualizar precisam ser incluídas depois
ON DUPLICATE KEY UPDATE
.Não é necessário listar as colunas no
INSERT
ouSELECT
, embora eu concorde que provavelmente seja uma prática melhor.fonte
Caso deseje criar um
non-primary
campo como critério / condiçãoON DUPLICATE
, é possível criar umaUNIQUE INDEX
chave nessa tabela para acionar oDUPLICATE
.Caso deseje combinar dois campos para torná-lo único na tabela, você pode conseguir isso adicionando mais no último parâmetro.
Note, apenas certifique-se de apagar primeiro todos os dados que tem o mesmo
name
eage
valor através das outras linhas.Depois disso, ele deve acionar o
ON DUPLICATE
evento.fonte
No meu caso, criei as consultas abaixo, mas na primeira consulta se
id
1 já existe e a idade já existe, depois disso, se você criar a primeira consulta semage
que o valor deage
será nonepara evitar o problema acima, crie uma consulta como abaixo
pode ajudá-lo ...
fonte
No caso, você deseja manter o campo antigo (por exemplo: nome). A consulta será:
fonte