mysql新增構成組合約束 Mysql中約束詳解

2021-10-18 11:40:27 字數 2503 閱讀 5089

約束定義

約束是用來限定表中資料準確性、完整性、一致性、聯動性的一套規則。在mysql中,約束儲存在information_schema資料庫的table_constraints中,可以通過該錶查詢約束資訊。如下圖:

常見的約束

not null

not null為非空約束,指定某一行的值不能為null。

我在t2表中新增了一列id3,設定varchar型別,not null約束。當執行插入insert into t2 (id1,id2) values(1,2); 操作的時候,出現了警告,但是插入資料成功。

很顯示,沒有達到我們預期的效果,不是說varchar/char/test等預設的是null嗎?既然我沒有賦值,針對預設的值,應該插入不成功啊?但是檢視資料如下:

於是我想,那麼我將id3設定為乙個null試試,結果如下圖,很顯然mysql對not null 約束,是建立在判斷插入語句裡面賦的值是不是null。如果限制為not null的列在插入語句沒有賦值null,則允許插入,否則禁止插入。(如果預設值null,且該列沒出現在插入語句,則會產生乙個警告資訊,但是仍然能插入okey)

備註:所有的型別的值都可以是null,包括int、float、datetime等資料型別 空字串(」)是不等於null,0也不等於null 。

unique

unique代表唯一約束。唯一約束是指定table的列或列組合不能重複,保證資料的唯一性。雖然唯一約束不允許出現重複的值,但是可以為多個null,同乙個表可以有多個唯一約束,多個列組合的約束。在建立唯一約束的時候,如果不給唯一約束名稱,就預設和列名相同。 mysql會給唯一約束的列上預設建立乙個唯一索引;

新增約束

alter table t2 add constraint uq_id2_id3 unique(id2,id3) ;

可以看到mysql會自動新增乙個唯一索引。

有沒有感覺,覺得唯一索引和唯一約束貌似就是一種東東。其實,兩者還是有區別的。首先從大的概念來說,索引是乙個樹用來快速搜尋的,約束是乙個邏輯限制。唯一約束是通過唯一索引實現的,換句說,唯一索引是實現唯一約束的基礎。所以,會發生這種情況:建唯一約束,會自動建唯一索引,但建唯一索引,不會自動建立唯一約束。但建立了唯一索引,會產生和唯一約束相同的效果,即不能插入重複值(但唯一索引和唯一約束允許出現多個空值),否則會報錯。

當建立唯一索引後,表的結果圖下圖

連續執行insert into t2 (id1,id2,id3) values(1,3,null); 插入成功。說明對於,當為空值時候,唯一索引是不進行判斷唯一性的。

主鍵約束相當於唯一約束+非空約束的組合,主鍵約束列不允許重複,也不允許出現空值;如果的多列組合的主鍵約束, 那麼這些列都不允許為空值,並且組合的值不允許重複。 每個表最多隻允許乙個主鍵,建立主鍵約束可以在列級別建立,也可以在表級別上建立。

mysql的主鍵名總是primary, 當建立主鍵約束時,系統缺省會在所在的列和列組合上建立對應的唯一索引。

foreign key

外來鍵約束是保證乙個或兩個表之間的參照完整性,外來鍵是構建於乙個表的兩個字段或是兩個表的兩個字段之間的參照關係。 也就是說從表的外鍵值必須在主表中能找到或者為空。 當主表的記錄被從表參照時,主表的記錄將不允許刪除,如果要刪除資料,需要先刪除從表中依賴該記錄的資料, 然後才可以刪除主表的資料。還有一種就是級聯刪除子表資料。

注意:外來鍵約束的參照列,在主表中引用的只能是主鍵或唯一鍵約束的列,假定引用的主表列不是唯一的記錄, 那麼從表引用的資料就不確定記錄的位置。同乙個表可以有多個外來鍵約束。

check

check約束針對mysql資料庫來說,沒有起作用。通過檢索網上資訊,說check約束,僅僅是乙個擺設而已,好吧,期待新版本新增此功能。

建立表t3

create table `t3` (

`id1` int(11) not null default 『0『,

`id2` int(3) unsigned zerofill default 『0『,

check(id1>3)

) engine=myisam default charset=utf8

執行insert into t3 values(1,3);,發現其確實沒有起到作用。

mysql新增構成組合約束 MySQL入門 約束

約束 約束是給表中的資料新增的強制執行的校驗規則,被增 刪 改的資料必須符合約束條件,查詢到的資料才是合理的。關係型資料庫中有5個完整性約束 非空約束 唯一性約束 主鍵約束 外來鍵約束 檢查約束 非空約束 not null 值不能為空,列級約束,約束條件寫在列的後面,僅對某列有效 非空約束 唯一性約...

mysql 新增約束 mysql怎麼新增約束?

在mysql資料庫中,建表時就可以進行對錶的各項進行一些操作,例如新增主鍵約束或者非空約束 也可以在建表後進行新增約束和刪除約束的操作。下面本篇文章就來帶大家具體了解一下,希望對大家有所幫助。什麼是約束?約束實際上就是表中資料的限制條件 目的是為了保證表中的記錄完整和有效。常用的約束有 1 非空約束...

mysql約束教程 mysql教程(七) 約束詳解

1 常見約束 not null 非空約束,針對某個字段設定其值不為空,如 學生的姓名不能為空。unique 唯一約束,它可以使某個欄位的值不能重複,如 email不能重複 primary key 主鍵約束,每個表應該具有主鍵,主鍵可以標識記錄的唯一性,主鍵分為單一主鍵和復合 聯合 主鍵,單一主鍵是由...