2015-04-30 121 views
2

我需要知道如何將CONSTRAINT添加到字段並確保它們是18+字段是年齡。MySQL ADD CONSTRAINT 18+

我可以看到下面的作品,通過加入ID和姓氏進行,將personId,但我怎麼得到它的工作,以確保一個人的生日是18歲或以上

ALTER TABLE Persons 
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName); 

我知道如何檢查DOB

SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age FROM `members` 

但是我如何將它放入ADD CONSTRAINT中。

+1

這幾乎就像在幾乎任何其他DBMS中添加一個約束'check(age> = 18)'一樣簡單。但是MySQL沒有實現'check'約束,所以你必須通過插入/更新語句或觸發器來執行。 –

+1

如果你存儲的是生日而不是年齡(如你應該那樣,因爲出生日期沒有改變,你會做些什麼,每年更新一次「年齡」專欄或每天更新? –

回答

1

之外的任何簡單約束(如外鍵引用)通常在DBMS中使用triggers完成。

你需要在insertupdate行動before觸發,以確保你失敗如果其中一個嘗試的設置低於18

時代的東西。如果你想簡單執行的列,其中一個具體的最小值,你可以修改它在insertupdate觸發:

new.colname = 18 

或離開它,因爲它是在update觸發:

new.colname = old.colname 

要強制失敗,可以raise a signal觸發器中。

順便說一句,這是相當不尋常的存儲的年齡在數據庫中(如果這確實是你在做什麼),因爲這是明顯的東西,將需要每年進行更新。更明智的做法是存儲不會更改的生日,並簡單地將年齡作爲計算字段。

+0

我認爲OP表示存儲的是「生日」,而不是年齡(或者,也許我從這個問題推斷出,因爲這是我的預期)。「年齡至少18歲」的檢查可以很容易地根據分配給'birthdate'列....'NEW.birthdate <= NOW() - INTERVAL 18 YEAR'。 – spencer7593

+0

@ spencer7593,是的,我原本以爲然後重新讀它。特別是把這個字段命名爲「年齡」,但是,它只是放在一邊,我會將它改爲「*如果*你在做X,Y可能會更好」。 – paxdiablo

+0

我知道,但這是一個大學的東西 – RussellHarrower

0

一般來說,在應用程序中而不是在數據庫中實現諸如此類的「業務邏輯」是最佳實踐。數據庫約束通常只能作爲一種預防措施,以確保無效數據無法進入數據庫:例如,它們可以用來確保外鍵引用有效對象,所需值不是不適當的空或零,等等。在正常操作下,應該不可能導致違反應用程序「前端」的約束。

其中一個主要原因是,將數據庫錯誤(例如,invalid value for column 'age'或類似的東西)轉換爲可以有用地向用戶顯示的錯誤(例如,對話框中說「你必須年滿18歲才能繼續「)。此外,通常很難甚至不可能允許數據庫限制的例外情況,或者在引入新的約束時允許現有的違規行爲「盛行」。

所以... 不要這樣做。在處理創建用戶的應用程序部分中檢查用戶的年齡(例如,g,你的註冊腳本)和/或其他可以改變其年齡的部分;或者在表示應用程序中的用戶的對象中。

相關問題