Sobes.tech
Middle
58

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

Сұралған компаниялар
Япоки

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

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