2009-02-06 229 views
1

我有一個SQL數據庫,我用它來存儲一些信息,每個記錄都有一個由數據庫生成的唯一ID。我的程序是用flash寫的,運行在網頁上,程序運行良好,它將記錄插入到數據庫中,並拉取最後一條記錄的idnumber並顯示給用戶,我的問題是,我如何處理多個併發條目,因爲程序會被多個用戶使用,沒準會有併發插入到數據庫中,所以我會怎麼能夠識別用戶經典數據庫插入問題

這裏正確的唯一ID號是插入數據庫

$query = "INSERT into $tablename (grade,school,country) VALUES ('$datarray[0]','$datarray[1]','$datarray[2]')"; 
$result = mysql_query($query) 
     or die("no rows selected"); 
代碼

之後,我加載另一個PHP文件在我的Flash文件中的第二個拉該記錄的ID和顯示它在這裏是代碼

$query = "SELECT max(id) from $tablename"; 
$result = mysql_query($query) 
     or die("no rows selected"); 
$row = mysql_fetch_array($result); // extracts one row 
echo "id=$row[0]"; 

我需要做什麼才能獲得該記錄的正確ID?

+0

哪個數據庫引擎? – kemiller2002 2009-02-06 15:10:03

回答

4

PHP有mysql_insert_id()返回

用於AUTO_INCREMENT 列生成由先前INSERT查詢上 成功,0的ID如果先前的查詢並 不會產生AUTO_INCREMENT值, 或FALSE如果沒有建立MySQL連接是 。

1

如果您的數據庫代碼返回最後插入的行的ID,這肯定會導致問題。

如果您正在使用SQL Server,你可以使用:

SELECT SCOPE_IDENTITY()

選擇回到正確的ID。更多信息,請致電MSDN article

,如果你給你如何做你的數據庫插入和什麼樣的技術你使用

+0

這個問題似乎是使用MySQL,沒有MSSQL。 – Powerlord 2009-02-06 15:25:53

+0

是的,我現在看到這個,他第一次問的時候並不明顯。 – 2009-02-06 15:36:37

2

你可以做你插入和下面的選擇操作到同一個交易的更多信息這將是有益的。 您也可以根據您的數據庫訪問設施。

+0

將插入和查詢合併到一個SP中 - 這使得事務更容易使用。 – Arkadiy 2009-02-06 16:25:48

-1

您可以將ID與用戶關聯,以便表中的主鍵爲複合(唯一ID生成,用戶ID)。

+0

如果用戶有兩個窗口打開? – 2009-02-06 15:13:29

1

你需要一個原子的方式來爲你的插入獲取一個唯一的ID。經典的方法是使用數據庫序列,在數據庫序列中查詢數據庫的下一個唯一編號,然後在插入時使用該編號作爲主鍵,或者(如果您使用的是在插入時生成唯一編號的MySQL)將插入並選擇一個原子語句。

0

使用交易 - 和我本人來說也不會在閃存寫(但這是我的個人opionion)。不幸的是,我沒有在閃存中做過這樣的事情 - 所以我不知道是否有來自該語言的事務支持 - 您可以做的是在數據庫上使用事務。我的意思是爲你建立的每一個連接 - 你打開一個交易,在這個交易中只有一個用戶 - 所以你有正確的ID顯示 - 但如果你使用自動遞增的數字作爲ID,你將仍然是相同的問題 - 因爲事務可以併發運行。我希望這會有所幫助;)

3

大多數數據庫都支持UUID/GUID鍵。用後端(甚至是ActionScript)生成它並在數據庫中使用它。這不是天然的關鍵,但即使在服務器農場內,它也是獨一無二的完美選擇。

0

務必把INSERT和SELECT語句轉換插入數據並返回ID的單個查詢

重要的是不要使用兩個單獨的查詢來檢索ID,因爲一旦第一次插入完成,另一個用戶可以(並最終將)在您有機會獲得第一個ID之前插入另一個記錄。

如果使用單獨的交易,你會最終有以下情形:

User1 : Inserts a record (id = 123) 
User2 : Inserts a record (id = 124) 
User1 : Requests max id (and gets back 124) <---- WRONG ID 
User2 : Requests max id (and gets back 124) 

如檢索插入的ID確切的語法上面的帖子指出的是DB具體。

0

首先你要使用PHP和MySQL。 ID列通常應定義爲:

id int(4) UNSIGNED NOT NULL AUTO_INCREMENT, 
-- Constraints 
primary key (id) 

使用id作爲名稱是自我記錄。一個4字節的整數可能會過度殺傷,尤其是因爲它是未簽名的,但是空間很便宜,而且它不太可能會用完id。

我也建議儘可能使用InnoDB引擎。外鍵和數據完整性是美好的事物。

你的腳本應該做一個mysql_connect(),這意味着每個用戶將獲得自己的連接到數據庫,因爲每個用戶的會話是該腳本的單獨實例。插入後,您可以使用mysql_insert_id()作爲前面的海報,指出獲取爲插入生成的ID。

0
insert ....; select last_insert_id()