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