Postgresql:如何使用 where 子句编写插入查询

Postgresql: How to write insert query using where clause

假设我们有一个名为 user 的 table,它有 userId 列。

user
----
userId

我们有另一个 table 叫做 Team,它有 2 列 userIdleadId

Team
----
userId
leadId

条件一: 我想将数据插入 Teams table 并且该值应该在用户 table 中。换句话说 userIdleadId of Teams table 应该 userId of user table。否则它会抛出用户 table.

中不存在 id 的错误

条件二: 还有一个条件是 userIdleadId 不能相同。这是通过使用 if check.

完成的

这是我的 API 代码

router.post('/', checkToken, async (req, res) => {
    try {
        const { body } = req;
        const {
            userId,
            leadId
        } = body

        const dataToInsert = {
            userId,
            leadId
        }

        if (userId == leadId) {
            res.status(300).json({ error: "Lead id and user can't be same." })
        }
        else {
            const data = await db.Team.create(dataToInsert)

            res.status(200).json({
                data
            })
        }

    } catch (e) {
        console.log("Error in inserting team lead", e)
        res.status(500).json({
            error: "Internal Server Error",
            status: false,
        })

    }
})

export default router;

请帮助如何处理条件 1

更新: 这就是我现在尝试的

  const IdCount= await db.User.findAll({
            attributes: [[db.Sequelize.fn('count', db.Sequelize.col('id')), 'getIdCount']],
            where: { "id": userId && leadId }
        });

IdCount 的输出:

这是输出,getIdCount 值为 0,这是正确的,但它向我发送了整个对象,我如何才能只获得 getIdCount 值?

[
  user {
    dataValues: { getIdCount: '0' },
    _previousDataValues: { getIdCount: '0' },
    _changed: Set(0) {},
    _options: {
      isNewRecord: false,
      _schema: null,
      _schemaDelimiter: '',
      raw: true,
      attributes: [Array]
    },
    isNewRecord: false
  }
]

你只需要确保这两个用户都存在于Users table中(对Users table执行两次查询)然后插入一条记录到Teams table.
最好使用显式事务来获取两个用户并将记录插入 Teams。

要获得您在数据库中有一个用户,您可以使用 count:

const whereClause = userId ?  {
            where: {
                id: userId,
            }
} : {}
const userCount = await db.User.count({
            where: {
                id: userId
            }
})
const userExists = count === 1;

你可以用同样的方法检查leadId

这是我所做的,它在所有条件下都给我正确的响应

router.post('/admin/assign', checkToken, authorize('admin'), async (req, res) => {
    try {
        const { body } = req;
        const {
            userId,
            leadId
        } = body

        const dataToInsert = {
            userId,
            leadId
        }
        const idCount = await db.User.count({ where: { [Op.or]: [{ id: userId }, { id: leadId }] } })

        if (userId == leadId) {
            res.status(400).json({ error: "Lead id and user can't be same." })

        }
        else if (idCount == 2) {
            const data = await db.Team.create(dataToInsert)

            res.status(200).json({
                data
            })
        }
        else {
            res.status(400).json({ error: "UserId or LeadId doesn't exist" })
        }



    } catch (e) {
        console.log("Error in inserting team lead", e)
        res.status(500).json({
            error: "Internal Server Error",
            status: false,
        })

    }
})

export default router;