Sobes.tech
Middle

Como fazer para que, ao inserir um registro duplicado numa tabela com chave única pelo número de telefone, em vez de erro, a linha existente seja atualizada (INSERT ON CONFLICT DO UPDATE)?

sobes.tech IA

Resposta da IA

В PostgreSQL для вставки записи с обновлением при конфликте по уникальному ключу используется конструкция INSERT ... ON CONFLICT ... DO UPDATE. В Go с использованием пакета database/sql или ORM (например, pgx, gorm) можно выполнить такой запрос напрямую.

Пример SQL-запроса:

INSERT INTO users (phone, name, email) VALUES ($1, $2, $3)
ON CONFLICT (phone) DO UPDATE SET
  name = EXCLUDED.name,
  email = EXCLUDED.email;

Здесь phone — уникальный ключ. При попытке вставить дубликат по phone произойдет обновление полей name и email существующей записи.

Пример на Go с использованием database/sql:

query := `
INSERT INTO users (phone, name, email) VALUES ($1, $2, $3)
ON CONFLICT (phone) DO UPDATE SET
  name = EXCLUDED.name,
  email = EXCLUDED.email;
`
_, err := db.Exec(query, phone, name, email)
if err != nil {
    // обработка ошибки
}

Таким образом, при вставке дублирующей записи не будет ошибки, а данные обновятся.