Запуск после вставки, обновление связанной модели Postgresql

Это первый раз, когда я создаю триггер, поэтому я немного запутался. Я следую этому руководству.

Вот что я сделал до сих пор:

DROP TRIGGER IF EXISTS "update_metas" ON "post";
CREATE TRIGGER "update_metas"
    AFTER INSERT ON "post"
    FOR EACH ROW EXECUTE PROCEDURE update_post_count();

У меня есть две таблицы: user и post. Что мне нужно сделать, так это увеличить столбец user.postCount для каждого нового созданного post. Внешний ключ post.user_id

Процедура, которую я создаю, следующая:

CREATE FUNCTION update_post_count() RETURNS TRIGGER AS $updates_user_postCount$
    BEGIN
        -- I know that NEW contains the new post info, so I
        -- can gather the user_id by doing NEW.post_id.
        -- 
        -- What exactly should I do here?
        RETURN NEW;
    END;
$updates_user_postCount$ LANGUAGE plpgsql;

Как мне структурировать эту процедуру? Могу ли я просто использовать прямой запрос SQL, например:

UPDATE "user"
    SET "user"."post_count" = "user"."post_count" + 1
    WHERE "user"."_id" = NEW.idol_id;

ОБНОВЛЕНИЕ

Я пытался использовать этот оператор SQL внутри процедуры, но он возвращает ошибку error: column "user" of relation "user" does not exist.

Вот оператор SQL, который я использовал для создания таблиц user и post:

CREATE TABLE IF NOT EXISTS "user" (
    _id BIGSERIAL UNIQUE,
    __id TEXT UNIQUE,
    fbid VARCHAR(100),
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(512) NOT NULL,
    profile_picture VARCHAR(512),
    profile_cover VARCHAR(512),
    profile_about TEXT,
    profile_birth_date BIGINT,
    social_facebook VARCHAR(256),
    social_twitter VARCHAR(256),
    social_instagram VARCHAR(256),
    post_count BIGINT,
    highlighted BOOLEAN,
    idol BOOLEAN,
    free BOOLEAN,
    blocked BOOLEAN
);

CREATE TABLE IF NOT EXISTS "post" (
    _id BIGSERIAL UNIQUE,
    __id TEXT UNIQUE,
    idol_id BIGINT,
    removed BOOLEAN,
    free BOOLEAN,
    created_at BIGINT,
    hashtags VARCHAR(1024),
    audio_src VARCHAR(512),
    audio_size INTEGER,
    audio_length INTEGER,
    FOREIGN KEY ("idol_id") REFERENCES "user"("_id")
);

person Maurício Giordano    schedule 29.05.2015    source источник


Ответы (1)


Ваша триггерная функция в основном верна. Единственная проблема заключается в том, что оператор UPDATE не может использовать нотацию table.column.

Из документации: Не указывайте имя таблицы. в спецификации целевого столбца — например, вкладка UPDATE SET tab.col = 1 недействительна.

CREATE FUNCTION update_post_count() RETURNS TRIGGER AS $updates_user_postCount$
BEGIN
  UPDATE "user"
  SET "post_count" = "post_count" + 1
  WHERE "_id" = NEW.idol_id;
  RETURN NEW;
END;
$updates_user_postCount$ LANGUAGE plpgsql;
person Patrick    schedule 29.05.2015
comment
Я добавил к вашему ответу об использовании FOR EACH ROW вместо FOR EACH STATEMENT, иначе NEW равно NULL. См.: stackoverflow.com/questions/11001118/ - person Maurício Giordano; 29.05.2015