【问题标题】:How to increment postgres table column after selecting the current value qith Node pg?选择当前值qith Node pg后如何增加postgres表列?
【发布时间】:2019-04-20 10:32:13
【问题描述】:

我正在创建一个包含用户、问题、答案、评论和投票表的应用。不确定这是否是一个好的决定,但我决定将投票表变成一个包含所有其他表的 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 列?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我使用双引号使 postgresql 使用骆驼大小写的列名。否则 Postgres 不会识别这些名称。我猜这只是我的风格。无论如何,这并不能解决我的问题。
    • @Dean 查看修改后的答案。
    • 谢谢。我使用了 INTEGER DEFAULT 0。它给了我“成功”的信息。但是表没有更新。这就是我在“成功”消息之后所拥有的。 quoverflow=#从投票中选择*;问题投票数 |回答投票数 |评论投票数 |帐号 |问题ID |回答ID | commentId -------------------+-----------------+------------ -------+-----------+------------+----------+------ ----- (0 行)
    • 看起来您的表中没有记录 - 所以没有什么要更新的。尝试在运行之前向查询添加日志打印(查看您将哪些参数作为 accountId 和 questionId 注入到查询中
    • 看起来正确的参数正在被注入。这就是日志所说的-查询: UPDATE vote SET "questionVoteCount" = "questionVoteCount" + 1 WHERE "questionId" = $1 AND "accountId" = $2 [ 1, 1 ] 成功 也许我需要填充“questionVoteCount”列以以 0 开头?
    【解决方案2】:

    更新表格-感谢 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),
    

    );

    我没有运行“更新”语句,而是使用“插入”“投票计数”,其中 1 表示赞成,-1 表示反对。

    现在我可以运行 'SELECT SUM("voteCount")' 来获得问题、答案、cmets、用户等的所有选票。

    【讨论】:

    • UPDATE vote SET "questionVoteCount" = "questionVoteCount" + 1 WHERE "questionId" = $1 AND "accountId" = $2 不起作用。您必须想出一个子查询,它首先获取questionVoteCount 的当前值并使用它来更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2021-08-31
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多