2008-11-09 71 views

回答

9

您可能希望在字段「Domain」上創建一個「UNIQUE」約束 - 如果您創建兩個在數據庫中具有相同域的行,此約束將引發錯誤。有關說明,請參閱this tutorial in W3C school -

http://www.w3schools.com/sql/sql_unique.asp

如果這沒有解決您的問題,請澄清你選擇使用數據庫(MySQL的?)。

注意:這個約束與您選擇的PHP作爲一種編程語言完全分開,它是一個SQL數據庫定義的事情。在SQL中表達這種約束的一個巨大優勢是,即使人們從數據庫導入/導出數據,您的應用程序有問題或其他應用程序共享數據庫時,也可以信任數據庫以保留約束。

0

我不太確定我是否理解你的問題,但也許你正在尋找SQL的"UNIQUE" constraint。如果查詢嘗試將預先存在的值插入到字段中,您(PHP)將收到關於此約束違規的通知。

0

有很多方法可以解決這個問題。您可以在該列上設置唯一約束(如主鍵)。如果該域也被插入,這將導致插入失敗。您也可以插入所有重複的域名,稍後再刪除它們。如果不是那麼多域重複的話,這將會很好。在查找重複行時,已經發布了幾個問題。

1

如果這是一個絕對的數據庫完整性要求(它不可能改變,現有數據也沒有這個問題),我會強制它在數據庫中有一個唯一的約束。

只要在嘗試之前或之後檢測它以通知用戶,就可以使用許多技術。

0

這可以用sql做,而不是用php。

我假設你正在使用MySQl,但是相同的原則將與不同的數據庫一起工作。

使域列成爲主鍵。 (有意義,因爲它必須唯一。)

而不是使用INSERT,請使用UPDATE。

如果主鍵已經存在(即您試圖放入表中),更新將更新現有的元組,而不是創建新的元組。

所以你會覆蓋現有的數據,如果它是不同的,如果它是相同的更新將被跳過。

1

數據來自哪裏?這是你只想運行一次還是一次或者經常運行?如果域值已經存在,你只是想跳過插入或做別的事情(即增加一個計數器)?

根據您的答案,有很多可能的解決方案:

  1. 預排序數據,消除重複,然後插入 (假定相對靜態的數據,空表開始)

  2. 在PHP中使用關聯數組作爲本地域值緩存 (如果表已經包含數據,則從讀取現有內容開始; 不是線程安全的,但是一次只能運行一次即可使用)

  3. 製作域內唯一的列,寫包裝代碼來處理返回錯誤

  4. 製作領域唯一或主鍵列,使用ON DUPLICATE KEY子句: INSERT INTO MYDATA(域,計數)VALUES (' firstdomain',1), ( 'seconddomain',1), ( '指向ThirdDomain',1) ON DUPLICATE KEY UPDATE計數=計數+ 1

  5. 插入所有數據插入表中,然後刪除重複

請注意,批處理插入(即對每個語句使用多個值子句)可以顯着更快。