2015-05-12 34 views
3

我盡了我的盡職調查資源並搜索解決此問題的方法,但找不到合適的答案具體的用例。將兩列限制爲兩個字段必須有數據的位置,或者兩個字段都必須爲NULL

我在一張表中有兩列:Packaged_ByPackaged_Time。兩者都初始化爲NULL字段。

我想要什麼:我希望兩個領域:1)有一個值不是NULL,或者2)請將這兩個字段作爲NULL

我不想要什麼:我再也不想爲了有其中一個列有一個值,但在其他列保持NULL的情況下。這大大提高了我的數據庫完整性。

不幸的是,我一直無法弄清楚如何用獨特的約束來做到這一點。

我的問題:我可以使用約束來強制兩個字段同時具有數據或NULL值嗎?是否有可能使用觸發器來實現這一點?我錯過了什麼?

任何指導或方向將不勝感激。謝謝。

編輯:我正在使用MySQL。

+0

爲什麼不爲這兩個設置一個默認值? – JordanBelf

+0

我認爲在MS SQL中你可能會設置約束條件(但我不太確定)。在MySQL中,我認爲你可以完成這個任務的唯一方法是使用TRIGGERs強制將NULL都設爲NULL。另外,關於UNIQUE約束,MySQL將每個NULL視爲唯一;這可能是不相關的,因爲兩行在這些字段中具有相同的值可能合法(即使不太可能)。 – Uueerdo

+1

檢查這個問題和答案:http://stackoverflow.com/questions/2115497/check-constraint-in-mysql-is-not-working – Tim3880

回答

2

該設計違反了Second Normal Form。你應該處理它的方式是創建第二個表,其中包括兩個不可爲空的數據字段和一個到原始表的外鍵。

+0

我檢查了你的資源,這非常有趣,但我不確定(用簡單的英語)爲什麼我試圖做的是壞的練習,當最終結果是我會有效地限制我的數據。部分我覺得這樣會導致不必要的連接,進一步減慢我的查詢速度。堅持這個標準有什麼好處? –

+0

爲什麼壞習慣是什麼?你的原創設計? [見這裏](http://stackoverflow.com/questions/29930453/)。如果你需要這樣做,這是一個必要的連接,而不是不必要的連接。您無法通過「感覺」來分析性能,您必須在真實應用程序上進行測試。如果像這樣的東西顯着減慢你的應用程序,你使用的是錯誤的數據庫技術。 –

+0

連接可能會影響查詢性能,並且有些人會執行一些非標準化以幫助提高性能。此處的問題是,您希望獲得這些好處並使用不支持檢查約束的數據庫服務器。 – Tim3880

相關問題