无论如何在提交TRANSACTION之前获得主键?

时间:2013-04-05 04:37:14

标签: php sql-server transactions

实际上我想到的是这样的场景:
假设我们正在管理一个存储许多书籍的图书馆 我们的图书馆网络应用程序允许用户将书籍添加到书架 该数据库有两个表,书籍和作者。架构如下:

CREATE TABLE Books
(book_id int NOT NULL IDENTITY(1,1),
book_name nvarchar(100) NOT NULL,
author_id int NOT NULL,
PRIMARY KEY (book_id),
FOREIGN KEY ( author_id ) REFERENCES Authors(author_id),)

CREATE TABLE Authors
(author_id int NOT NULL IDENTITY(1,1),
author_name nvarchar(100) NOT NULL,
PRIMARY KEY (author_id))

假设请求将获得作者姓名和书名以将书存放在书架上 如果没有这样的作者,它将自动为作者生成条目。但我希望这个操作成为一个交易。(如果出现问题,我希望一切都回滚。)
我可以在结束交易之前获得主键吗?

$server_name = "s3";
$connection_info = array( "Database"=>"bis_testing", "UID"=>"bisuser", "PWD"=>"111");
$conn = sqlsrv_connect( $server_name, $connection_info);

sqlsrv_begin_transaction( $conn )

$sql = "INSERT INTO Author(author_name)
       values
       (?);";

$author_name = 'Dr. Pro';
$stmt1 = sqlsrv_query( $conn, $sql, array($brand_name));
**// get author primary key to $author_pk**

$sql = "INSERT INTO Book(book_name, author_id)
       values
       (?,?);";

$book_name = 'Writing that works';
$stmt2 = sqlsrv_query( $conn, $sql, array($book_name, $author_pk));

if ($stmt1 && $stmt2) {
    echo 'done';
}

如果没有,我该怎么做?

1 个答案:

答案 0 :(得分:0)

我没有看到像MySQL中那样获取最后一个插入ID的方法,但您可以从SQL Server获取最后插入的ID,如下所述:Best way to get identity of inserted row?

你也可以查看一个可以做你需要做的事情的存储过程,虽然我不知道如何用这些函数调用它。