Php PostgreSQL事务一次完成

Php PostgreSQL事务一次完成,php,postgresql,pdo,Php,Postgresql,Pdo,在我非常简单的PostgreSQL v8.4.13数据库中,包含表A和B,列A.A,是一个序列主键,即外键到B.A。两个表中都有其他列a不是唯一的 在一个事务的范围内,我想在A中添加一行,在B中添加一行 我正在使用PHPPDO为PGL编写脚本 一次往返能做这样的事吗 是否可以在一次往返中对多行B执行类似操作?只要更新到同一个数据库,每个事务都可以执行多个执行: $dbh->beginTransaction(); $dbh->exec("UPDATE A SET last = 'hi'

在我非常简单的PostgreSQL v8.4.13数据库中,包含表
A
B
,列
A.A
,是一个
序列主键
,即
外键
B.A
。两个表中都有其他列<在
B
中,code>a不是唯一的

在一个事务的范围内,我想在
A
中添加一行,在
B
中添加一行

我正在使用PHPPDO为PGL编写脚本

一次往返能做这样的事吗


是否可以在一次往返中对多行
B
执行类似操作?

只要更新到同一个数据库,每个事务都可以执行多个执行:

$dbh->beginTransaction();
$dbh->exec("UPDATE A SET last = 'hi'");
$dbh->exec("UPDATE B SET name = 'Rafael'");
/* MULTIPLE EXECS HERE */
$dbh->commit();

您可以使用
插入。。。返回
语句以检索
A.A
的新生成的
序列
值,您可以使用A将两个
插入
打包到同一语句中:

WITH Inserted AS (
  INSERT INTO A (data)
  VALUES ('data')
  RETURNING A.a
)
INSERT INTO B (a, data)
SELECT Inserted.a, 'more data'
FROM Inserted;
如果要在
B
中插入多条记录,您可以填写
表达式中的剩余字段,并加入
插入
的新
a.a
值:

WITH Inserted (a) AS (
  INSERT INTO A (data)
  VALUES ('data')
  RETURNING A.a
),
BValues (data) AS (
  VALUES
    ('data1'),
    ('data2'),
    ('data3')
)
INSERT INTO B (a, data)
SELECT Inserted.a, BValues.data
FROM Inserted CROSS JOIN BValues;

当然,您必须选择退出自动提交w/。当您说“一次往返”时,您是指一次exec调用(一次查询)?我是指从脚本向数据库发送一条消息,返回值为任意值。我对连接的了解不够,不知道如何更好地说明它。只需用
分隔查询即可。我为什么要删除表
A
?这是一个在一个事务中同时运行这两个语句的示例。我误解了你的问题吗?我的回答没有误导你,我不知道你为什么否决我。我没有否决你,我想其他人这样做是因为他知道
A
中的数据对我非常重要。
DROP
语句是一个事务中多个语句的示例。当然,您不会复制粘贴此代码并盲目运行它…谢谢!现在我很想知道这是否是在没有显式启动的情况下作为事务执行的。@QED:如果您没有显式启动事务,Postgres将开始并为每个语句提交一个事务(尽管有多个子表达式,但一个CTE将计为一个语句)。许多客户端库都会通过在后台启动自己的事务来覆盖这种行为,尽管我可以告诉您,PDO的默认行为似乎与Postgres一致。是否可以通过一次往返在
B
中插入多行?