强制将记录插入多个表中

时间:2015-01-07 15:09:35

标签: php mysql pdo

我有两张表parentchild。我想只在查询成功的情况下才在两个表中插入记录。理想情况下,数据库会强制执行完整性,但是,如果需要,可以使用应用程序执行此操作。潜在地,我可以做类似下面的事情,但是,似乎会有更优雅的方法来做到这一点。该如何实现?

<?php
//parent must be inserted first as child has a FK constraint to it
$stmt1=$conn->prepare('INSERT INTO parent(id,data) VALUES(?,?)');
if($stmt1->execute(array(123,"foo"))) {
    $stmt2=$conn->prepare('INSERT INTO child(parent_id,data) VALUES(?,?)');
    if(!$stmt2->execute(array(123,"bar"))) {
        $stmt3=$conn->prepare('DELETE FROM parent WHERE id=?');
        $stmt3->execute(array(123));
    }
}
?>

EDIT。会有类似以下的工作吗?

<?php

$queries=array(
    array('sql'=>'INSERT INTO parent(id,data) VALUES(?,?)',$data=>array(123,"foo")),
    array('sql'=>'INSERT INTO child(parent_id,data) VALUES(?,?)',$data=>array(123,"bar")),
    //More if necessary array('sql'=>'',$data=>array()),
);

doMultipleQueries($queries);

function doMultipleQueries($queries) {

    try {
        $conn->beginTransaction();
        foreach($queries as $query) {
            $stmt=$conn->prepare($query['sql']);
            $stmt->execute($query['data']);
        }
        $conn->commit();
        return true;
    } catch (Exception $e) {
        $conn->rollBack();
        return false;
    }
}
?>

模式

CREATE TABLE IF NOT EXISTS `parent` (
  `id` INT NOT NULL,
  `data` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `child` (
  `parent_id` INT NOT NULL,
  `data` VARCHAR(45) NULL,
  PRIMARY KEY (`parent_id`),
  CONSTRAINT `fk_child_parent`
    FOREIGN KEY (`parent_id`)
    REFERENCES `parent` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

3 个答案:

答案 0 :(得分:2)

您应该查看数据库事务,如果其中一个操作失败,他们将返回所有操作

答案 1 :(得分:2)

使用交易: http://dev.mysql.com/doc/refman/5.0/en/commit.html

此外,您可以将约束设置为在DELETES和UPDATES上级联更改,而不是不执行任何操作。 http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

答案 2 :(得分:0)

当然交易是最好的解决方案,但如果不喜欢使用它,你可以使用PDO进行多次查询,see this page