一篇文章帶你完全瞭解MySQL各類約束

MySQL約束

<1> 概念

  • 是一種限制,它是對錶的行和列的數據作出約束,確保表中數據的完整性和惟一性。

<2> 使用場景

  • 建立表的時候,添加約束

<3> 分類

  • default: 默認約束, 域完整性
  • not null: 非空約束,域完整性
  • unique: 惟一約束,實體完整性
  • primary key: 主鍵約束,實體完整性
  • foreign key: 外鍵約束,參照完整性
  • check: 檢查約束(MySQL不支持),域完整性
  • auto_increment: 自增加約束
  • unsigned: 無符號約束
  • zerofill: 零填充約束

數據庫中有三個完整性: 域、實體、參照完整性數據庫

  • 域(列)完整性:設計

    • 域完整性是對數據表中字段屬性的約束
  • 實體完整性在MySQL中實現:code

    • 經過主鍵約束和候選鍵約束實現的
  • 參照完整性:rem

    • 也就是說是MySQL的外鍵

1. default

  • 概念table

    • 指定某列的默認值,插入數據時候,此列沒有值,則用default指定的值來填充
  • 添加date

    • 在建立表的時候添加: create .... defaultselect

      • create table t1(

             id int default 1,
             name varchar(20) default '老王'im

    );數據

    • 經過alter語句添加: alter .... modify/change ....異常

      • alter table t1 modify id int default 2;
      • alter table t1 change name name varchar(20) default '若塵';
  • 刪除

    • alter .... modify/change
    • alter table t1 modify id int;
    • alter table t1 change name name varchar(20);

2. not null

  • 概念

    • 指定某列的值不爲空,在插入數據的時候必須非空 '' 不等於 null, 0不等於 null
  • 添加

    • 在建立表的時候添加: create .... not null

      • create table t2(

             id int not null,
             name varchar(20) not null

    );

    • 經過alter語句添加: alter .... modify/change ....

      • alter table t2 modify id int not null;
      • alter table t2 change name name varchar(20) not null;
  • 刪除

    • alter .... modify/change
    • alter table t2 modify id int;
    • alter table t2 change name name varchar(20);

3. unique

  • 概念

    • 指定列或者列組合不能重複,保證數據的惟一性
    • 不能出現重複的值,可是能夠有多個null
    • 同一張表能夠有多個惟一的約束
  • 添加惟一約束

    • 在建立表的時候添加: create .... unique

      • create table t3(

             id int unique,
             name varchar(20) not null

    );

    - >insert t3 value (1, '老王');       
    insert t3 value (1, '老李');  -- id 惟一約束,添加異常
    - create table t3(
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id int,
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name varchar(20) not null,

           constraint id_unique unique(id, name) -- 添加複合約束
    );

    - >insert t3 value (1, '老王'); 
    insert t3 value (1, '老李'); 
    select * from t3;
    insert t3 value (1, '老王');
    • 經過alter語句添加: alter .... modify/change ....   /   alter .... add unique

      • alter table t3 modify id int unique;
      • alter table t3 add unique(name);
      • alter table t3 add constraint un_id unique(id);

3. 刪除惟一約束

  • alter .... drop .... index 名稱
  • drop index on 表名
  • alter table t3 drop index id_unique;
  • 注意:若是刪除的惟一約束列具備自增加約束,則必須先刪除自增加約束,再去刪除惟一約束

4. 主鍵約束

  • 概念

    • 當前行的數據不爲空而且不能重複
    • 至關於:惟一約束+非空約束
  • 添加主鍵約束

    • 在建立表的時候添加: create .... primary key

      • create table t4(

             id int primary key,
             name varchar(20)

    );

    - create table t3(
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id int,
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name varchar(20),

           [constraint id_primary] primary(id, name) -- 聯合約束

    • 經過alter語句添加: alter .... modify/change ....   /   alter .... add primary key ....

      • alter table t4 modify id int primary key;
      • alter table t3 add constraint un_primary primary key(id, name);
  • 刪除主鍵

    • alter .... drop primary key
    • alter table t4 drop primary key;
  • 注意:若是刪除的主鍵約束具備自增加約束,則必須先刪除自增加約束,再去刪除主鍵約束。

5. auto_increment: 自增加約束

  • 概述

    • 列的數值自動增加,列的類型只能是整數類型
    • 一般給主鍵添加自增加約束
  • 添加

    • 在建立表的時候添加: create .... auto_increment

      • create table t5(

             id int primary key auto_increment,
             name varchar(20)

    );

    • 經過alter語句添加: alter .... modify/change ....auto_increment
    • alter table t5 change id id int auto_increment;
  • 刪除自增加

    • alter .... modify/change...
    • alter table t5 modify id int;
  • 注意:

    • 一張表只能有一個自增加列,而且該列須要定義約束

6. unsigned: 無符號約束

  • 概念

    • 指定當前列的數值爲非負數
    • age tinyint 1 -128~127 unsigned 0~255
  • 添加

    • 在建立表的時候添加: create .... unsigned

      • create table t6(

             id int,
             age tinyint unsigned

    );

    • 經過alter語句添加: alter .... unsigned modify/change ....
    • alter table t6 change age age tinyint unsigned;
    • alter table t6 modify age tinyint unsigned;
  • 刪除

    • alter .... modify/change ....
    • alter table t6 modify age tinyint;
    • alter table t6 change age age tinyint;

7. zerofill: 零填充約束

  • 概念

    • 指定當前列的數值的顯示格式,不影響當前列顯示範圍
  • 添加

    • 在建立表的時候添加: create .... zerofill

      • create table t7(

             id int,
             age int(6) zerofill

    );

  • 刪除

    • alter .... modify/change ....
    • alter table t7 modify age int;
    • alter table t7 change age age int;

8. foreign key: 外鍵約束

  • 經過創建外鍵,設置表與表之間的約束性,限制數據的錄入

    員工表(從表)                       部門表(主表)
    員工號    員工姓名  部門名稱          部門號  部門名稱
    1        張三      1                1         人力
    2        李四      2                2         銷售
    3        王五      3
  • 概述

    • 創建表與表之間的關係,創建參照完整性,一個表能夠有多個外鍵,每一個外鍵必須參照另外一個主鍵。
    • 被外鍵約束的列,取值必須參照其主表列中的值
    • 注意:一般先建立主表,再建立從表
  • 添加外鍵約束

    • create table emp(

           empno int promary key auto_increment,
           ename varchar(32) not null,
           deptno int,
           [constraint fk_name] foreign key(deptno) references dept(deptno) -- 添加外鍵約束

);

- create table dept(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deptno int primary key auto_increment,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dname varchar(32),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loc varchar(32)

);

- 使用alter add constraint ....
- alter table emp add constraint fk_name foreign key(deptno) references dept (deptno);
  • 刪除外鍵約束

    • alter .... drop foreign key fk_name
    • alter table emp drop foreign key fk_name;
  • 注意:

    • 在建立表時,不去明確指定外鍵約束的名稱,系統會自動地生成一個外鍵的名稱。
    • 使用 show create table 表名 查看具體的外鍵名稱
  • 設置外鍵中的級聯關係

    • on delete cascade: 刪除主表中的數據時,從表中的數據隨之刪除
    • on update cascase: 更新主表中的數據時,從表中的數據隨之更新
    • on delete set null: 刪除主表中的數據時,從表中的數據置空
  • 級聯刪除

    • create table emp(

           empno int promary key auto_increment,
           ename varchar(32) not null,
           deptno int,
           [constraint fk_name] foreign key(deptno) references dept(deptno) on delete cascade-- 添加外鍵約束

);

  • 注意:

    • 插入數據時,先插入主表的數據,再插入從表的數據
    • 刪除數據時,先刪除從表的數據,再刪除主表的數據

數據庫的設計

  • 主鍵約束
  • 自增加約束
  • 外鍵約束(慎用)
  • 惟一約束
  • 非空約束
  • 默認約束
相關文章
相關標籤/搜索