Próbuję zaktualizować moją tabelę z innej tabeli tymczasowej o nazwie fałszywy e-mail, ale kiedy wykonałem następujące czynności:

update users
SET email = fake_email2.email
FROM fake_email2
where users.id = fake_email2.id

Otrzymałem następujący błąd:

ERROR:  duplicate key value violates unique constraint "index_users_on_email"

Czy jest sposób, aby to zaktualizować?

1
Siddhartha Guerrero 16 grudzień 2019, 23:05
1
W kolumnie e-mail istnieje ograniczenie e-mail. Nie możesz tego zrobić.
 – 
Dr. X
16 grudzień 2019, 23:07
1
Prawdopodobnie w Twojej tabeli fake_email2 są duplikaty. Sprawdź, czy otrzymujesz wyniki dla SELECT email FROM fake_email2 GROUP BY email HAVING count(*) > 1;. Pojawiające się adresy e-mail mają duplikaty.
 – 
sticky bit
16 grudzień 2019, 23:17
1
Najpierw musisz rozwiązać sporny e-mail. W zestawie wierszy tabeli fake_email2 nie może być podwójnych + istniejący użytkownicy nieobecni w fake_email2.
 – 
Serg
16 grudzień 2019, 23:20

3 odpowiedzi

Najlepsza odpowiedź

Problem polega na tym, że tabela users zawiera Ograniczenie, które wymaga, aby pola adresu e-mail były unikatowe dla wszystkich wierszy w tabeli users.

Uruchom następujące zapytanie, aby zlokalizować bieżące wiersze pasujące do zestawu danych przychodzących:

SELECT users.id, users.email, fake_email2.email, *
FROM users
INNER JOIN fake_email2 ON users.id = fake_email2.id

W rzeczywistości możesz znaleźć duplikaty za pomocą tego zapytania:

SELECT users.id, users.email, fake_email2.email
FROM users
INNER JOIN fake_email2 ON users.id = fake_email2.id
WHERE EXISTS (SELECT u2.email FROM users as u2 where u2.Id <> users.Id AND u2.email = fake_email2.email )

Masz więc dwie możliwości:

  1. Usuń unikalne ograniczenie
  2. Usuń wiersz, który ma zduplikowany adres e-mail

Opublikowanie listy danych, struktur i skryptu tworzenia ograniczenia może pomóc w określeniu szczegółów, ale ostatecznie DBA określił, że adres e-mail jest unikalny dla każdego rzędu, nie należy tego próbować obejść.

2
Chris Schaller 17 grudzień 2019, 08:22

from nie jest częścią składni update. Zamiast tego należy użyć zapytania zagnieżdżonego:

update users
set email = (
    select fe.email 
    from fake_email2 fe 
    where users.id = fe.id
)
0
Andronicus 16 grudzień 2019, 23:08

Możesz zignorować wiersze, które spowodowałyby błąd update:

update users
    set email = fake_email2.email
    from fake_email2
    where users.id = fake_email2.id
    on conflict (index_users_on_email) do nothing;
0
Gordon Linoff 16 grudzień 2019, 23:55