2015-07-20 88 views
1

每天我在mysql中添加近5000條新記錄,我想防止在表中插入重複行,我想我應該檢查所有的銀行befor任何插入操作,是嗎?適當? 或者有更好的方法來做到這一點? 在此先感謝防止表中有超過20000條記錄的重複數據

+4

是在MySQL做一組列'UNIQUE'的 – Daan

+0

檢查插入之前,重複更新 –

+0

使用... https://dev.mysql.com/ doc/refman/5.7/en/insert-on-duplicate.html – donald123

回答

1

通過對字段屬性應用唯一索引來防止數據模型被軟件破壞是一個很好的選擇,該屬性必須是不可複製的。

在插入數據之前向數據庫詢問重複的候選者甚至更好。

最好的是,將兩者結合起來。數據庫模型的安全性和軟件層中重複的問題,因爲a)錯誤處理比查詢要昂貴得多,b)約束保護數據免受人爲失敗的影響。

mysql支持CREATE UNIQUE INDEX語句的唯一索引。例如:CREATE UNIQUE INDEX IDX_FOO ON BAR(X,Y,Z);例如:CREATE UNIQUE INDEX IDX_FOO ON BAR(X,Y,Z);

在表BAR上創建唯一索引。在運行重複查詢時也會使用此索引 - 加快處理速度。

查看MySQL Documentation瞭解更多詳情。

+0

感謝gorefest,我缺乏源!有時我更喜歡有重複的數據,而不是檢查所有的表,我認爲這個操作需要很多來源,但是......? – Hamed

+0

如果你知道防止重複的列,你需要的只是索引。 INSERT將導致數據庫阻止該操作,然後導致唯一的索引違例。如果您的重複數量很少,這是防止模糊的最簡單方法。如果您有多個重複候選項,則應首先查詢重複值以避免更大的錯誤處理開銷。這很容易通過選擇索引列來實現。 – gorefest

1

當您遇到數據完整性問題時,您希望數據庫執行規則(如果可能)。在你的情況下,你可以使用唯一的索引或唯一的約束來實現,這是同一事物的兩個名字。下面是語法示例:

create unique index idx_table_col1_col2 on table(col1, col2) 

你想這樣做,在數據庫中,原因有三:

  • 您希望數據庫知道是該列是獨一無二的。
  • 您不希望多線程應用程序「意外」插入重複值。
  • 您不希望將這些重要的支票放入應用程序,他們可能會「意外」刪除這些支票。

的MySQL則具有非常有用的構建來處理重複,特別是insert . . . on duplicate key updateinsert ignorereplace

當您從應用程序運行SQL查詢時,無論如何您都應該檢查錯誤,因此捕獲重複的鍵錯誤應該不會增加應用程序的負擔。

0

首先,需要是唯一可以使用UNIQUE約束的任何列:

CREATE TABLE IF NOT EXISTS tableName 
(id SERIAL, someUniqueColumnName VARCHAR(255) NOT NULL UNIQUE); 

見MySQL文檔for adding uniqueness to existing columns

您需要決定表中的重複內容,因爲唯一性並不總是侷限於單列。例如,在一個表格中,用戶使用相應的ID存儲其他內容的用戶,則它們可能都是合併的,必須是唯一的。對於您可以有PRIMARY KEY它採用兩列:

CREATE TABLE IF NOT EXISTS tableName (
    id BIGINT(20) UNSIGNED NOT NULL, 
    pictureId BIGINT(20) UNSIGNED NOT NULL, 
    someOtherColumn VARCHAR(12), 
    PRIMARY KEY(id, pictureId));