2013-07-12 45 views
0

MySQL數據庫中的表有一列用於電子郵件地址。最終,電子郵件地址應該是唯一的,並且具有有效的格式。我很難決定檢查的位置以及檢查的必要性。需要唯一的電子郵件地址

顯然,SQL本身並不能完全驗證電子郵件地址,但我正在考慮添加NOT NULL約束來防止提交空白電子郵件地址。由於每個電子郵件地址必須是唯一的,因此e-mail列的唯一密鑰似乎是合理的,但僅僅因爲列是唯一密鑰並不會使其NOT NULL正確嗎?由於我可能會使用PHP驗證服務器上的電子郵件地址,因此我可以檢查它是否爲空。

我正在製作的一條關鍵信息是是否添加了唯一鍵或約束使搜索更快或更慢

對於保存電子郵件地址的列,應該沒有重複項,也沒有空字符串/空值等,是否應將其作爲唯一鍵和/或給定約束或其他約束?

我是MySQL的新手,所以代碼示例會有幫助。如果使用phpMyAdmin更容易,我有phpMyAdmin。

對於唯一我會用ALTER TABLE USER ADD UNIQUE INDEX(``e-mail``);
對於沒有空,我會用ALTER TABLE user CHANGE ``e-mail`` varchar(254) NOT NULL;

另一個想法我是插入一行與一個空的e-mail地址,然後進行郵件列唯一的,這樣沒有其他空電子郵件地址可以插入。

+0

您可以使用SQL驗證電子郵件(使用自定義約束),並且添加密鑰通常會使搜索更加快速 –

+0

與唯一索引相比,唯一約束更好地傳達您的意圖。 –

+0

@ MikeSherrill'Catcall'有什麼區別?根據[這裏](http://stackoverflow.com/questions/3245328/what-is-the-difference-between-unique-index-and-unique-key)這些術語是同義詞。 – Celeritas

回答

1

添加唯一約束,實際上使搜索更快,因爲它會通過這個字段索引的表。根據你對問題的描述,我認爲你的alter table陳述是正確的。

1

具有唯一索引的字段仍然可以允許空值。空值永遠不可能等於其他任何值,包括它們自己,因此多個空值不會違反唯一性約束。但是,您可以通過將其指定爲NOT NULL來禁止該字段中的空值。

唯一鍵是一個正常的字段索引,簡單地不允許特定值的多個實例。插入/更新會稍微減慢,因此可以更新密鑰,但搜索速度會更快,因爲索引可以(在某些情況下)用於加速搜索。

1

到目前爲止的答案都很好,我建議您使用UNIQUE KEYNOT NULL作爲您的應用程序。使用UNIQUE KEY可能會減慢INSERTUPDATE,但它肯定不會減慢搜索速度。

然而,有一件事你應該考慮的是,僅僅因爲你使用UNIQUE KEY,它不一定強制唯一的電子郵件地址。例如,[email protected][email protected]代表相同的電子郵件。如果您不想允許這樣做,您應該在將電子郵件地址發送到數據庫之前使用PHP對電子郵件地址進行標準化。

+0

您能詳細說明規範化電子郵件地址嗎?也許最好是廢除'UNIQUE KEY'和'NOT NULL'並在PHP中做所有事情。 – Celeritas

+0

通過規範化我的意思是刪除電子郵件的用戶名部分中的句點。我不建議從數據庫中刪除'NOT NULL'和'UNIQUE KEY'。即使您可以在前端級別強制執行所有任務,仍然有許多優勢可以使您的架構保持其原有的方式。例如,如果您的PHP在驗證過程中存在錯誤,則可能會導致數據庫中的不一致。或者當其他人正在開發系統的其他部分時,如果他們發現模式不強制使用'UNIQUE KEY'或'NOT NULL',他們可能會做出不必要的/錯誤的假設。 – cheeyos

0

用MySQL,你要記住,唯一索引取決於你的整個表格的核對(在其他數據庫,你可以對upper()功能)。 看到這個鏈接: http://sqlfiddle.com/#!2/37386/1 現在,如果您使用utf8_general_ci insted utf8_bin索引創建將失敗。

相關問題