2016-03-06 51 views
0

我對此有這樣的疑問: 當兩個用戶點擊書籍按鈕時,在同一毫秒內,MySQL數據庫會進行雙重輸入。如何避免向數據庫添加雙重數據?MySQL在避免重複輸入時,同時輸入2條相同記錄

參考文獻: 後端:PHP 前端:HTML/CSS/JS

我試圖給執行入口語句之前隨機中斷。

例如:當用戶按下:現在預訂時,我會阻止下一個過程幾秒鐘。然後讓它繼續向MySQL插入數據。

但這似乎是不好的做法。

我可以知道解決此問題的更好方法嗎?

編輯:例如,我有一個劇院預訂系統。情況是:兩個或兩個以上的用戶同時預訂同一個插槽並將其預訂。而其中一個應該獲得成功,其餘的應該會得到一個錯誤。

+0

如果您在數據庫表中使用主鍵,MySQL將不會**創建​​重複條目。它只會執行兩個查詢中的一個,另一個會失敗,即使它們在確切的時間被髮送到數據庫。 – Aziz

+0

感謝您的回覆。例如,我有一個劇院預訂系統。會發生什麼情況是,兩個用戶同時預訂同一個插槽並將其預訂。而其中一個應該會出錯。 – Smit

+0

如果你的數據庫設計正確,這不應該發生。例如,如果您使用表格預訂時間段,其中主鍵是日期和時間,那麼您不能在同一個時間段中在該表中有兩個條目。 – Aziz

回答

0

如果在此PK列中使用PrimaryKeys和Auto Increment功能,則不會發布雙重條目到數據庫。

+1

抱歉,這不是真的:自動遞增主鍵只能爲您提供一個很好的主鍵,並且對重複的數據字段不起作用 –

+0

感謝您的回覆。例如,我有一個劇院預訂系統。會發生什麼情況是,兩個用戶同時預訂同一個插槽並將其預訂。而其中一個應該會出錯。 – Smit

+0

對不起對呀 你也必須添加獨特的參數。 – linx

1

爲了防止對用戶只需輸入的數據重複條目(只是爲了防止提交按鈕插入場景中雙擊),你可以使用幾種解決方案:

  • 使用JavaScript按鈕只觸發一次;
  • 對內容& user_id使用UNIQUE INDEX

唯一索引的情況可以看如下:

CREATE TABLE user_comments (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
comments VARCHAR(4000), 
user_id INT NOT NULL, 
md5sum_comments CHAR(32) 
) ENGINE=InnoDB; 

CREATE UNIQUE INDEX idx_unique_comments ON user_comments(md5sum_comments,user_id); 

md5sum_comments是在評論欄是md5sum,因爲真正的註釋可以是大的一個指標。

如果您現在爲用戶插入兩次相同的註釋,則其中一個插入操作將失敗,並且MySQL的NON-UNIQUE索引錯誤。既然你不想用這個非唯一索引問題打擾你的用戶,你可以在php中捕獲它,並在進一步處理中忽略它。

+0

我猜這個問題存在誤解。我已經添加了「編輯」更精確的問題。如果有幫助。謝謝。 – Smit

+0

你也可以使用唯一的索引解決方案:代替評論,閱讀'booked_slot',在那裏有一個唯一的值,插入到'預訂'表中。但是,現在兩個預訂同時發生時,一個會成功,另一個用戶應該得到錯誤。總之:在這些情況下,'UNIQUE INDEX'是你的朋友。 –