-- Your SQL goes here -- First, we delete the already duplicated data so that the constraint can be correctly applied DELETE FROM api_tokens a USING api_tokens b WHERE a.id > b.id AND a.value = b.value; DELETE FROM blog_authors a USING blog_authors b WHERE a.id > b.id AND a.blog_id = b.blog_id AND a.author_id = b.author_id; DELETE FROM blogs a USING blogs b WHERE a.id > b.id AND ((a.actor_id = b.actor_id AND a.instance_id = b.instance_id) OR a.ap_url = b.ap_url OR a.outbox_url = b.outbox_url OR a.inbox_url = b.inbox_url); DELETE FROM comments a USING comments b WHERE a.id > b.id AND (a.ap_url = b.ap_url); DELETE FROM follows a USING follows b WHERE a.id > b.id AND (a.ap_url = b.ap_url); DELETE FROM instances a USING instances b WHERE a.id > b.id AND (a.public_domain = b.public_domain); DELETE FROM likes a USING likes b WHERE a.id > b.id AND (a.ap_url = b.ap_url OR (a.user_id = b.user_id AND a.post_id = b.post_id)); DELETE FROM mentions a USING mentions b WHERE a.id > b.id AND (a.ap_url = b.ap_url); DELETE FROM post_authors a USING post_authors b WHERE a.id > b.id AND a.author_id = b.author_id AND a.post_id = b.post_id; DELETE FROM posts a USING posts b WHERE a.id > b.id AND ((a.ap_url = b.ap_url) OR (a.blog_id = b.blog_id AND a.slug = b.slug)); DELETE FROM reshares a USING reshares b WHERE a.id > b.id AND (a.ap_url = b.ap_url OR (a.user_id = b.user_id AND a.post_id = b.post_id)); DELETE FROM tags a USING tags b WHERE a.id > b.id AND a.tag = b.tag AND a.post_id = b.post_id AND a.is_hashtag = b.is_hashtag; DELETE FROM users a USING users b WHERE a.id > b.id AND (a.ap_url = b.ap_url OR (a.username = b.username AND a.instance_id = b.instance_id) OR a.outbox_url = b.outbox_url OR a.inbox_url = b.inbox_url OR a.followers_endpoint = b.followers_endpoint); -- Then we add the UNIQUE constraints ALTER TABLE api_tokens ADD CONSTRAINT api_tokens_unique_value UNIQUE (value); ALTER TABLE blog_authors ADD CONSTRAINT blog_author_unique UNIQUE (blog_id, author_id); ALTER TABLE blogs ADD CONSTRAINT blog_unique UNIQUE (actor_id, instance_id); ALTER TABLE blogs ADD CONSTRAINT blog_unique_ap_url UNIQUE (ap_url); ALTER TABLE blogs ADD CONSTRAINT blog_unique_outbox UNIQUE (outbox_url); ALTER TABLE blogs ADD CONSTRAINT blog_unique_inbox UNIQUE (inbox_url); ALTER TABLE comments ADD CONSTRAINT comments_unique_ap_url UNIQUE (ap_url); ALTER TABLE follows ADD CONSTRAINT follows_unique_ap_url UNIQUE (ap_url); ALTER TABLE instances ADD CONSTRAINT instance_unique_domain UNIQUE (public_domain); ALTER TABLE likes ADD CONSTRAINT likes_unique UNIQUE (user_id, post_id); ALTER TABLE likes ADD CONSTRAINT likes_unique_ap_url UNIQUE (ap_url); ALTER TABLE mentions ADD CONSTRAINT mentions_unique_ap_url UNIQUE (ap_url); ALTER TABLE post_authors ADD CONSTRAINT post_authors_unique UNIQUE (post_id, author_id); ALTER TABLE posts ADD CONSTRAINT post_unique_slug UNIQUE (blog_id, slug); ALTER TABLE posts ADD CONSTRAINT post_unique_ap_url UNIQUE (ap_url); ALTER TABLE reshares ADD CONSTRAINT reshares_unique UNIQUE (user_id, post_id); ALTER TABLE reshares ADD CONSTRAINT reshares_unique_ap_url UNIQUE (ap_url); ALTER TABLE tags ADD CONSTRAINT tags_unique UNIQUE (tag, post_id, is_hashtag); ALTER TABLE users ADD CONSTRAINT users_unique UNIQUE (username, instance_id); ALTER TABLE users ADD CONSTRAINT users_unique_inbox UNIQUE (inbox_url); ALTER TABLE users ADD CONSTRAINT users_unique_outbox UNIQUE (outbox_url); ALTER TABLE users ADD CONSTRAINT users_unique_ap_url UNIQUE (ap_url); ALTER TABLE users ADD CONSTRAINT users_unique_followers_url UNIQUE (followers_endpoint);