Tenho as seguintes tabelas:
create workers (
id SERIAL PRIMARY KEY,
name STRING
);
create works_zones (
id SERIAL PRIMARY KEY,
area_name String,
work_from TIME WITHOUT TIMEZONE,
work_until TIME WITHOUT TIMEZONE
)
create table shifts (
id SERIAL PRIMARY KEY,
worker_id INT,
day_of_week INT,
work_zone INT,
CONSTRAINT fk_worker FOREIGN KEY(worker_id) REFERENCES workers(id) ON DELETE CASCADE,
CONSTRAINT fk_work_zone FOREIGN KEY(work_zone) REFERENCES works_zones(id) ON DELETE CASCADE
)
E nos meus turnos de mesa tenho os seguintes registros:
eu ia | trabalhador_id | dia da semana | work_zone |
---|---|---|---|
1 | 1 | 1 | 1 |
2 | 1 | 1 | 1 |
3 | 2 | 2 | 1 |
3 | 2 | 2 | 1 |
No meu caso , quero aplicar um índice exclusivo nas colunas worker_id
, na tabela :day_of_week
work_zone
shifts
CREATE UNIQUE INDEX CONCURRENTLY unique_day_zone_worker ON shifts (worker_id,work_zone,"day_of_week");
Mas de acordo com meus registros falhará. Portanto, gostaria de detectar registros duplicados para que eu possa corrigi-los manualmente. Alguma ideia de como posso fazer isso?
Em outros wqords, desejo detectar os shift.id
que possuem registros duplicados nas colunas worker_id
, day_of_week
, work_zone
.
Uma resposta para isso é a seguinte: https://stackoverflow.com/a/32265524/4706711
No seu caso, você precisará executar:
Você precisará excluir manualmente e atualizar os registros de acordo usando atualizar e selecionar consultas. Em seguida, você precisará criar um índice exclusivo:
Sugiro usar uma transação única para atualizações, exclusões e índices exclusivos para evitar contratempos.