CREATE TABLE IF NOT EXISTS posts ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL, content TEXT NOT NULL, upvotes INTEGER NOT NULL DEFAULT 0, downvotes INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users (id) ); -- Create a function to set created_at and updated_at on INSERT CREATE OR REPLACE FUNCTION set_timestamps_on_insert() RETURNS TRIGGER AS $$ BEGIN NEW.created_at = NOW(); NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Create a trigger to call the function after INSERT CREATE TRIGGER set_timestamps_on_insert BEFORE INSERT ON posts FOR EACH ROW EXECUTE FUNCTION set_timestamps_on_insert(); -- Create a function to set updated_at on UPDATE CREATE OR REPLACE FUNCTION set_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Create a trigger to call the function after UPDATE CREATE TRIGGER set_updated_at BEFORE UPDATE ON posts FOR EACH ROW EXECUTE FUNCTION set_updated_at(); CREATE INDEX posts_user_id_index ON posts (user_id); CREATE INDEX posts_id_index ON posts (id); CREATE INDEX idx_created_at_desc ON posts (created_at DESC);