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ć?
3 odpowiedzi
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:
- Usuń unikalne ograniczenie
- 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ść.
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
)
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;
Podobne pytania
Nowe pytania
sql
Structured Query Language (SQL) to język służący do wykonywania zapytań w bazach danych. Pytania powinny zawierać przykłady kodu, strukturę tabeli, przykładowe dane i znacznik używanej implementacji DBMS (np. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 itp.). Jeśli Twoje pytanie dotyczy wyłącznie konkretnego DBMS (używa określonych rozszerzeń / funkcji), użyj zamiast tego tagu tego DBMS. Odpowiedzi na pytania oznaczone tagiem SQL powinny używać standardu SQL ISO / IEC.
fake_email2
są duplikaty. Sprawdź, czy otrzymujesz wyniki dlaSELECT email FROM fake_email2 GROUP BY email HAVING count(*) > 1;
. Pojawiające się adresy e-mail mają duplikaty.