Plume/migrations/postgres/2018-12-08-175515_constraints/up.sql

84 lines
3.5 KiB
SQL

-- 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);