2014-01-29 35 views
0

我有一個用於檢測文章視圖的表格 - 每個article_id&&NULL&&IP都有一個唯一的行,當沒有人登錄時,每個article_id&&loggedInUser&&IP都有唯一的行。
所以我認爲,當沒有人登錄時,我只會添加NULL而不是user_id。但MySQL的驚訝我 - 當我添加UNIQUE KEY像article_id&&user_id&&IP它工作得很好了登錄的用戶,但如果沒有用戶登錄其開始添加等(例如)行:當數值爲NULL時,MySQL唯一索引不適用

article_id | user_id | IP 
    5    NULL  192.168.3.50 
    5    NULL  192.168.3.50 
    5    NULL  192.168.3.50 
    5    NULL  192.168.3.50 

這似乎沒有太多獨特 - 我知道它是由NULL引起的,但是如何解決這個問題呢?我應該僅僅依賴於沒有用戶將user_id設置爲「0」的事實嗎?

謝謝。

+0

你可以把創建表語法的信息? –

+1

這是有意和記錄 - http://dev.mysql.com/doc/refman/5.0/en/create-index.html。「一個UNIQUE索引允許多個NULL值可以包含NULL的列」。我可能會使用0,或者設置一個'none'用戶標識符以防其他目的使用0(即,我經常將數字id輸入字段轉換爲int等價物,如果有人在玩耍,那麼可能是0不想讓0有效)。 – Kickstart

+0

@Kickstart請描述整體問題多一點 - 這可能是一個很好的答案:) –

回答

1

這是故意的,並且記錄在案: -

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

唯一索引創建的約束,使得該指數的所有值必須是不同的。如果嘗試使用與現有行匹配的鍵值添加新行,則會發生錯誤。 此約束不適用於除BDB存儲引擎以外的NULL值。對於其他引擎,UNIQUE索引允許可以包含NULL的列的多個NULL值。如果您爲UNIQUE索引中的列指定前綴值,則列值在前綴中必須是唯一的。

儘管您可以使用用戶ID爲0,但我會擔心您可能在別處找不到記錄時使用了0。例如,我經常只是將任何輸入ID字段轉換爲整數,如果有人試圖繞過並輸入一個字符串,這可能會轉換爲0.在這種情況下,我不會真的想讓零有意義。

我可能會試圖在這種情況下設置一個'none'userid。

+0

1)它不能被砍掉,因爲它是一個純粹的內部PHP的東西2)即使如此,它將被視爲未記錄的用戶 - 這很好3)如前所述'沒有'我曾考慮過這一點,但在我看來,要保持整數,但感謝深入的描述:) –

+0

只是說,如果有人攻擊腳本並設法通過,可能會向他們顯示真實數據在被翻譯爲0的東西中。至於沒有,我的意思是通用用戶的用戶記錄。可能是id 1,或其他任何數字。 – Kickstart

0

您目前的解決方案將會非常快速地增長,並且提供很少的好處。如果是我,我只能依靠analytics來處理這類數據。如果你真的想要這樣做,可以通過在表格中添加一個字段來進行計數,從而輕鬆完成。當你要添加一行到這個看起來已經存在的行時。如果有人這樣做,而不是添加新記錄,只需更新當前記錄並改爲增加計數。這將在更少的空間中提供完全相同的信息。