數(shù)據(jù)庫中常見的六種約束,有一種MySql不支持,你知道是哪個嗎?
數(shù)據(jù)庫中的約束,顧名思義即是對插入數(shù)據(jù)庫中的數(shù)據(jù)進行了一定的限定,這樣做的目的是為了保證數(shù)據(jù)的完整性和有效性。這樣會大幅度地提升數(shù)據(jù)庫中數(shù)據(jù)的質(zhì)量,節(jié)省數(shù)據(jù)庫空間和提高運行效率。
那么,常見的數(shù)據(jù)庫約束有哪幾種呢?我們下面一起來看一下。
1、主鍵約束Primary Key
理論上來說,每一個數(shù)據(jù)表都應該設置一個唯一主鍵,它就像身份證一樣,唯一標識著這條數(shù)據(jù)。設置為主鍵的列不允許為空,也在全表里面唯一。
2、非空約束Not Null
非空約束意味著這張數(shù)據(jù)表中的某一列是必填字段,既不允許為空。就比如我們在使用很多網(wǎng)上系統(tǒng)的時候,用戶名密碼都不能為空一樣。
3、唯一約束Unique
唯一約束用來保護表中的某列數(shù)據(jù)不允許重復,它與主鍵約束類似,但是級別沒有主鍵高。一份表中,唯一約束可以創(chuàng)建多個,并且唯一約束的列通??梢詾榭?。通常在一個系統(tǒng)里面,類似于手機號、賬戶、郵箱等,都會被設置為唯一約束。
4、默認約束Default
有些時候,我們插入數(shù)據(jù)的時候,不會把所有的數(shù)據(jù)列內(nèi)容都填入,因此,有些列會被設置一個默認值,如果沒有給該列設置值,就會默認值來填充。例如我們在很多系統(tǒng)里面,插入國籍的時候,默認都是中國,除非自己去改動,否則就會使用默認值。
5、外鍵約束Foreign Key
外鍵約束用于在兩個表之間的數(shù)據(jù)設立關聯(lián),例如一個城市屬于那個國家,這個國家的代碼應該與國家表的主鍵相關聯(lián),即一個城市所屬的國家應該存在于地球上,而不是會出現(xiàn)某個城市位于世界上沒有的國家。
6、檢查約束Check
檢查約束意為對該列的數(shù)值進行檢查,例如說我們在做一個系統(tǒng)的時候,年齡這個字段,其取值范圍應該不小于0,因為世界上沒有小于0歲的人。而這個最大值也應該有一個范圍。據(jù)說世界上活得最久的人是清朝的李清云,享年256歲,一生中娶了24位妻子,共有180位子女。雖然隨著科學的進步,人們的壽命在增長。但是如果現(xiàn)在出現(xiàn)一個年齡為500歲的人,我們都會覺得數(shù)據(jù)一定是有問題的。
而這樣的問題是經(jīng)常會發(fā)生的。例如說2011年的時候,意大利農(nóng)業(yè)供應管理局就在數(shù)據(jù)庫中將30多萬頭意大利奶牛的壽命從122個月提高到了999個月,導致很多奶牛在系統(tǒng)里面擁有了近乎“永久”的戶口,從而用于騙取歐盟的農(nóng)業(yè)補貼。
因此我們可以看到,檢查約束對于數(shù)據(jù)的完整性而言還是很有用的,雖然我們也可以將相關代碼在業(yè)務邏輯層實現(xiàn)。但是多一層保護都是好的,畢竟有修改數(shù)據(jù)庫權限的系統(tǒng)可能不止一個。
但是在流行的MySql數(shù)據(jù)庫里,check約束卻是不被支持的。不同于PostgresSQL等數(shù)據(jù)庫,在MYSQL中,CHECK只是一段可調(diào)用但毫無意義的子句。MySQL會直接忽略。如果想實現(xiàn)Check約束的話,可以考慮寫一個觸發(fā)器。
除了Check約束以外,還有很多其它數(shù)據(jù)庫支持而MySql不支持的操作,例如說不支持intersect操作、datetime不支持毫秒等。
但是這并不妨礙MySql被很多企業(yè)所使用,畢竟它的優(yōu)點還是很多的。