2013-04-05 65 views
0

其實我想到了這樣一個場景:
假設我們正在管理一個存儲很多書籍的圖書館。
我們的圖書館網絡應用程序允許用戶將書籍添加到書架上。
該數據庫有兩個表格,書籍和作者。模式如下:
無論如何,在提交TRANSACTION之前獲取主鍵?

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'; 
} 

如果不是,我應該怎麼做這份工作?

+0

刪除了MySQL標籤。在這個問題中沒有MySQL – Phil 2013-04-05 04:43:04

+0

我不是一個SQL Server的人,但嘗試這樣的事情? http://stackoverflow.com/questions/7917695/sql-server-return-value-after-insert – Sam 2013-04-05 05:07:34

回答

0

我不明白的方式得到最後插入的id像MySQL,但是你可以從SQL Server中的最後插入的id作爲這裏討論:Best way to get identity of inserted row?

你也可以尋找到一個存儲過程會做你需要做的事情,雖然我不知道你會怎樣用這些函數來調用它。

+0

但是,該方法不適用於使用事務時。我試過了。作爲一名程序員,我認爲存儲過程會產生難以維護的代碼。實際上,另一個好的選擇是使用GUID作爲主鍵,因爲我將在運行中知道密鑰。 – 2013-04-05 05:00:11

相關問題