Middle
Come fare in modo che, inserendo un record duplicato in una tabella con chiave unica sul numero di telefono, invece di un errore venga aggiornato il rigo esistente (INSERT ON CONFLICT DO UPDATE)?
sobes.tech AI
Risposta dell'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 {
// обработка ошибки
}
Таким образом, при вставке дублирующей записи не будет ошибки, а данные обновятся.