Sobes.tech
Middle

Wie kann man sicherstellen, dass beim Einfügen eines doppelten Eintrags in eine Tabelle mit einem eindeutigen Schlüssel anhand der Telefonnummer anstelle eines Fehlers die vorhandene Zeile aktualisiert wird (INSERT ON CONFLICT DO UPDATE)?

sobes.tech KI

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

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