Postgresql查询检查id是否存在,如果不存在将插入(临时)并且如果存在则回滚所有

时间:2017-07-31 08:34:11

标签: php postgresql yii2

我只是编程的初学者

我想知道是否有人能解决我的问题(PostgreSQL& Yii2)

我有一个按钮来提交这些数组数据(本例中只有5行):

+----+--------+
| id |  name  |
+----+--------+
| 1  | apple  |
| 2  | orange |
| 3  | manggo |
| 1  | fish   |
| 4  | meat   |
+----+--------+
  1. 如果id = 1不存在,请插入record1(或temp tbl)
  2. 如果id = 2不存在,请插入record2(或temp tbl)
  3. 如果id = 3不存在,则插入record3(或temp tbl)
  4. 如果id = 1不存在,则插入record2(这一个失败,取消所有1,2,3并停止)
  5. 每个步骤使用2个查询(SELECT COUNT& INSERT)

    +----+--------+
    | id |  name  |
    +----+--------+
    | 1  | apple  |
    | 2  | orange |
    | 3  | manggo |
    | 4  | fish   |
    | 5  | meat   |
    +----+--------+
    

    对于第二种情况,毕竟继续(直到id = 5没有记录存在)提交数据库

    谢谢

1 个答案:

答案 0 :(得分:0)

确保id列具有唯一约束,假设您的id列是它应该具有的主键。打开一个事务,然后只插入行,如果id已经存在,则DB将抛出错误。如果抛出错误,请捕获它并执行回滚,否则提交事务。

示例:

$data = [
    ['id' => 1, 'name' => 'Item 1'],
    ['id' => 2, 'name' => 'Item 2'],
    ['id' => 3, 'name' => 'Item 3'],
    ['id' => 4, 'name' => 'Item 4'],
    ['id' => 5, 'name' => 'Item 5'],
];

$connection = Yii::$app->db;
$transaction = $connection->beginTransaction();
try {
    foreach ($data as $item) {
        $connection->createCommand()->insert('{{%your_table}}', $item)->execute();
    }
    $transaction->commit();
} catch (\yii\db\IntegrityException $exception) {
    $transaction->rollBack();
}

我不知道您自己插入ID值有多重要,但您可能最好使用id列的序列号。