选择节点q的当前值后如何增加postgres表列?

时间:2019-04-17 03:18:56

标签: javascript sql node.js postgresql node-pg-pool

我正在创建一个具有用户,问题,答案,评论和投票表的应用程序。不知道这是否是一个好决定,但是我决定将投票表变成一个包含所有其他表的ID的联接表,而不是让每个其他表都有一个vote_count列,因为投票将属于其他所有表。

投票表如下-

    CREATE TABLE vote (
     "questionVoteCount"       SERIAL,
     "answerVoteCount"         SERIAL,
     "commentVoteCount"        SERIAL,
     "accountId"               INTEGER REFERENCES account(id),
     "questionId"              INTEGER REFERENCES question(id),
     "answerId"                INTEGER REFERENCES answer(id),
     "commentId"               INTEGER REFERENCES comment(id),
     PRIMARY KEY ("questionVoteCount", "answerVoteCount", 
     "commentVoteCount")
     );

我的模型看起来像这样-

    class Vote {
constructor({
    questionVoteCount,
    answerVoteCount,
    commentVoteCount,
    accountId,
    questionId,
    answerId,
    commentId
} = {}) {
    this.questionVoteCount =
        this.questionVoteCount || VOTE_DEFAULTS.questionVoteCount
    this.answerVoteCount = this.answerVoteCount || VOTE_DEFAULTS.answerVoteCount
    this.commentVoteCount =
        this.commentVoteCount || VOTE_DEFAULTS.commentVoteCount
    this.accountId = accountId || VOTE_DEFAULTS.accountId
    this.questionId = questionId || VOTE_DEFAULTS.questionId
    this.answerId = answerId || VOTE_DEFAULTS.answerId
    this.commentId = commentId || VOTE_DEFAULTS.commentId
}

static upVoteQuestion({ accountId, questionId }) {
    return new Promise((resolve, reject) => {
        pool.query(
            `UPDATE vote SET "questionVoteCount" = 
                               "questionVoteCount" + 1 WHERE 
                               "questionId" = $1 AND "accountId" = 
                               $2`,
            [questionId, accountId],
            (err, res) => {
                if (err) return reject(err)
                resolve()
            }
        )
    })
}

我希望每个问题/答案/评论都有一个投票数,并且在投票路线上张贴的用户会增加或减少上述任何一项的投票。我该怎么做呢?我觉得我对投票表本身犯了一些错误。我是否应该坚持在每个表中都有一个vote_count列的最初想法?

2 个答案:

答案 0 :(得分:1)

您将questionVoteCount声明为类型SERIAL,这意味着自动递增。看来您想要将其定义为INTEGER

答案 1 :(得分:0)

更新表-感谢alfasin

CREATE TABLE vote (
 "questionVoteCount"       INTEGER DEFAULT 0 NOT NULL,
 "answerVoteCount"         INTEGER DEFAULT 0 NOT NULL,
 "commentVoteCount"        INTEGER DEFAULT 0 NOT NULL,
 "accountId"               INTEGER REFERENCES account(id),
 "questionId"              INTEGER REFERENCES question(id),
 "answerId"                INTEGER REFERENCES answer(id),
 "commentId"               INTEGER REFERENCES comment(id),

);

不是运行“ UPDATE”语句,而是对“ vosCount”使用1代表upvote,-1代表downvote的'INSERT'对我有用。

现在,我可以运行'SELECT SUM(“ voteCount”)'以获得问题,答案,评论,用户以及其他任何方式的所有票。