假设我有以下表格
CREATE TABLE discussions (
d_id SERIAL NOT NULL PRIMARY KEY,
d_v_id INTEGER /* foreign key */
);
CREATE TABLE votings (
v_id SERIAL NOT NULL PRIMARY KEY,
v_active BOOLEAN NOT NULL,
v_d_id INTEGER NOT NULL /* foreign key */
);
这些表被认为具有1:n的关系(投票是n)。表discussions
将外键存储到单个投票中,该投票被视为当前活动。我想要做的是在php中创建一个函数,将字段discussions.d_v_id
设置为特定的id。但是,只有在要设置的投票的字段v_active
为true
时才会发生这种情况。请注意,d_v_id
也可以设置为null
,我希望通过单个查询实现此目的
到目前为止,这是我能够提出的:
public function setVoting($discussionId, $vId) {
$this->init();
$query = "UPDATE discussions d SET d_v_id = ?
FROM votings v
WHERE d_id = ?
AND (v_id = ? OR d_v_id IS NOT NULL)
AND v_d_id = ?
AND v_active = TRUE";
$this->con->beginTransaction();
$stmt = $this->con->prepare ( $query );
$stmt->bindParam(1, $vId);
$stmt->bindParam(2, $discussionId);
$stmt->bindParam(3, $vId);
$stmt->bindParam(4, $discussionId);
$stmt->execute();
if ($stmt->rowCount() == 1){
$this->con->commit();
return true;
}
$this->con->rollBack();
return false;
}
php代码工作正常,它只是关于sql查询。此代码的问题是,即使此投票有v_active = false
,如果另一个投票目前设为d_v_id