Sobes.tech
Back to questions
Middle
4

Есть таблица с уникальным ключом по номеру телефона. Как сделать так, чтобы при вставке дублирующей записи вместо ошибки происходило обновление существующей записи (INSERT ON CONFLICT DO UPDATE)?

Companies where asked
Япоки

Answer from AI

sobes.tech AI

В 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 {
    // обработка ошибки
}

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