2012-05-28 88 views
0

我有一個Mysql表。如何避免mysql primaryKey約束錯誤

  • 請求 - REQUEST_ID,Request_message

用戶填充Request_message以HTML形式的用戶後,點擊提交按鈕。我將從請求表中生成一個請求ID,然後添加該行。 (表中有兩個命中,一個用於獲取最後一個request_id,另一個用於將該行添加到表中)。我想避免這種情況。

另外,假設同時有7-8個用戶點擊提交按鈕,他們將從表中獲得最後一個request_id。他們會將1添加到最後一個request_id,並嘗試添加該行。除了一個都得到主鍵約束錯誤 ..如何避免這??

請提供您的建議。

感謝 Devesh

+0

您能指定如何讓用戶輸入前端使用的數據/策略嗎?在這種情況下,應使用自動增量/插入交易的數據創建id –

回答

2

使用AUTO_INCREMENT主鍵。

編輯: 如果你不使用整數類型的列,那麼另一種解決方案是使用行級鎖。

+0

我想使用rquest_id的形式是REQ0001,REQ0002 ..... REQ0100 ...... –

+0

@DeveshAgrawal請參閱我的編輯。 – xdazz

+0

@DeveshAgrawal更好的方法是使用數字標識並將其轉換爲顯示。 – glglgl

0

使用sp將表中的記錄插入。

對錶中的主鍵使用自動編號字段。

使用

INSERTINTO request 
      (Request_id, 
      Request_message) 
VALUES  ((SELECT 'REQ' + Lpad(Ifnull(Max(Request_id) + 1, 0), 4, 0) 
       FROM request), 
       yourMessage) 
+0

我想用rquest_id的形式是REQ0001,REQ0002 ..... REQ0100 ...... –

+0

在存儲過程中創建下一個要插入的主鍵然後執行插入語句。 –

+0

是Romil ..這就是我正在做的事情。但有可能4-5個用戶可以得到相同的最後一個request_id。 (而另一個生成下一個ID其他將得到相同的最後一個ID)..所以在添加表中的行他們生病primary_key約束錯誤。 –

0

對於第一個問題,你可以做這樣的事情

INSERT INTO request (Request_id,Request_message) VALUES (
    (SELECT MAX(Request_id) FROM request), yourMessage) 

或更好的,你可以使用autoincrement爲P.K.此外,如果您要求您的數據庫管理系統增加/減少所有問題,您可以避免直接涉及到的問題。

+0

它再次嵌套查詢..對嗎?此外Request_id的形式是REQ0001,REQ0002 ....所以我瘦最大(Request_id + 1)將無法正常工作.... –

+0

@DeveshAgrawal如果id的是REQxxyy,它不會工作,但你沒有指定它成了問題。 Hovever我的答案(預計從SQL部分)是sitll有效,如果你添加一列將包含一個整數autoincremented,將p.k. – DonCallisto

+0

但表中的所有REQxxxx都不相同。所以我不認爲有一個額外的列只是爲了AUTO_INCREMENT是一個好主意..因爲這裏REQuset_id僅適用於PK –