Mysql基礎02-約束

約束與索引

概念

一、數據完整性(Data Integrity)是指數據的精確性(Accuracy)和可靠性(Reliability)。mysql

  • 實體完整性(Entity Integrity):例如,同一個表中,不能存在兩條徹底相同沒法區分的記錄sql

  • 域完整性(Domain Integrity):例如:年齡範圍0-120,性別範圍「男/女」數據庫

  • 引用完整性(Referential Integrity):例如:員工所在部門,在部門表中要能找到這個部門工具

  • 用戶自定義完整性(User-defined Integrity):例如:用戶名惟1、密碼不能爲空等spa

二、約束指針

  • 鍵約束:主鍵約束、外鍵約束、惟一鍵約束code

  • Not NULL約束:非空約束orm

  • Check約束:檢查約束blog

  • Default約束:默認值約束排序

  • 自增約束

三、約束(CONSTRAINTS)與索引(INDEX)

約束是用來對數據業務規則和數據完整性進行實施、維護。約束的做用範圍僅限在當前數據庫,是邏輯約束,不會由於設置約束而額外佔用空間。

索引是一個單獨、物理的存儲在數據頁上的數據庫結構,它是表中一列或若干列值的集合和相應的指向表中數據值的物理標識數據頁的邏輯指針清單(相似於新華字典的目錄索引頁)。能夠大大提升查詢速度。應該在鍵列、或其餘常常要查詢、排序、按範圍查找的列上創建索引。

Mysql會在主鍵、惟一鍵、外鍵列上自動建立索引,其餘列須要創建索引的話,須要手動建立。

其中主鍵刪除,對應的索引也會刪除

刪除惟一鍵的方式是經過刪除對應的索引來實現的

刪除外鍵,外鍵列上的索引還在,若是須要刪除,須要單獨刪除索引

查看某個表的約束

SELECT * FROM information_schema.table_constraints WHERE table_name = '表名稱';
或
SHOW CREATE TABLE 表名;

查看某個表的索引

SHOW INDEX FROM 表名稱;

主鍵約束:primary key

主鍵分爲單列主鍵和複合主鍵

主鍵的特色

(1)惟一而且非空(2)一個表只能有一個主鍵約束(3)主鍵約束名就叫作PRIMARY(4)建立主鍵會自動建立對應的索引,一樣刪除主鍵對應的索引也會刪除。

建表時指定主鍵約束

create table 【數據名.】表名(
  字段名1 數據類型 primary key ,
  ....
);
或
create table 【數據名.】表名(
  字段名1 數據類型,
  ....,
  primary key(字段名1)
);
或
create table 【數據名.】表名(
  字段名1 數據類型,
  字段名2 數據類型,
  ....,
  primary key(複合主鍵字段列表)  #若是是複合主鍵,那麼就須要在全部字段列表後面使用這種形式指定,不能在字段後面直接加primary key
);

建表後指定主鍵約束

alter table 表名稱 add primary key (主鍵字段列表);

刪除主鍵約束

alter table 表名稱 drop primary key;

惟一鍵約束:unique key

惟一鍵約束特色:

(1)同一個表能夠有多個惟一約束。(2)惟一約束能夠是某一個列的值惟一,也能夠多個列組合值的惟一。(3)MySQL會給惟一約束的列上默認建立一個惟一索引。(4)刪除惟一鍵只能經過刪除對應索引的方式刪除,刪除時須要指定惟一鍵索引名

建表時指定惟一鍵約束

create table 【數據名.】表名(
  字段名1 數據類型 primary key ,
  字段名2 數據類型 unique key,
  ....
);

create table 【數據名.】表名(
  字段名1 數據類型 primary key ,
  字段名2 數據類型,
  字段名3 數據類型,
  ....,
  unique key(複合惟一字段列表)  #若是是複合惟一鍵,那麼就須要在全部字段列表後面使用這種形式指定,不能在字段後面直接加unique key
);

建表後增長惟一鍵約束

alter table 表名稱 addconstraint 約束名】 uniquekey】 (字段名列表);

#若是沒有指定約束名,(字段名列表)中只有一個字段的,默認是該字段名,若是是多個字段的默認是字段名列表的第1個字段名。

刪除惟一鍵約束

ALTER TABLE 表名稱 DROP INDEX 惟一鍵約束名;

外鍵約束:foreign key

外鍵特色:

  • 外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構建於一個表的兩個字段或是兩個表的兩個字段之間的參照關係。

  • 在建立外鍵約束時,若是不給外鍵約束名稱,默認名不是列名,而是自動產生一個外鍵名(例如 student_ibfk_1;),也能夠指定外鍵約束名。

  • 當建立外鍵約束時,系統默認會在所在的列上創建對應的普通索引。可是索引名是列名,不是外鍵的約束名。

  • 刪除外鍵時,關於外鍵列上的普通索引須要單獨刪除。

要求

  • 在從表上創建外鍵,並且主表要先存在。

  • 一個表能夠創建多個外鍵約束

  • 從表的外鍵列,在主表中引用的只能是鍵列(主鍵,惟一鍵,外鍵),推薦引用主表的主鍵。

  • 從表的外鍵列與主表被參照的列名字能夠不相同,可是數據類型必須同樣

約束關係:約束是針對雙方的

添加了外鍵約束後,主表的修改和刪除受約束

添加了外鍵約束後,從表的添加和修改受約束

5個約束等級

  • Cascade方式:在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄

  • Set null方式:在父表上update/delete記錄時,將子表上匹配記錄的列設爲null,可是要注意子表的外鍵列不能爲not null

  • No action方式:若是子表中有匹配的記錄,則不容許對父表對應候選鍵進行update/delete操做

  • Restrict方式:同no action, 都是當即檢查外鍵約束

  • Set default方式(在可視化工具SQLyog中可能顯示空白):父表有變動時,子表將外鍵列設置成一個默認的值,但Innodb不能識別

若是沒有指定等級,就至關於Restrict方式

建表時指定外鍵約束

create table 【數據名.】從表名(
  字段名1 數據類型 primary key ,
  字段名2 數據類型 【unique key】,
  ....,
  【constraint 外鍵約束名】 foreign key (從表字段) references 主表名(主表字段) 【on update 外鍵約束等級】【on delete 外鍵約束等級】
);

#外鍵只能在全部字段列表後面單獨指定
#若是要本身命名外鍵約束名,建議 主表名_從表名_關聯字段名_fk

建表後指定外鍵約束

alter table 從表名稱 addconstraint 外鍵約束名】 foreign key (從表字段名) references 主表名(主表被參照字段名) 【on update xx】【on delete xx】;

刪除外鍵約束

ALTER TABLE 表名稱 DROP FOREIGN KEY 外鍵約束名;

#刪除外鍵約束不會刪除對應的索引

刪除索引

ALTER TABLE 表名稱 DROP INDEX 索引名;

非空約束:not null

規定某個字段不能爲空

建表時指定非空約束

create table 【數據名.】表名(
  字段名1 數據類型 primary key ,
  字段名2 數據類型 【unique key】 【not null】,
  字段名2 數據類型 【not null】,
  ....,
);

建表後指定非空約束

ALTER TABLE 表名稱 MODIFY 字段名 數據類型 NOT NULLdefault 默認值】;

#若是該字段原來設置了默認值約束,要跟着一塊兒再寫一遍,不然默認值約束會丟失

刪除非空約束

ALTER TABLE 表名稱 MODIFY 字段名 數據類型 【default 默認值】;

#若是該字段原來設置了默認值約束,要跟着一塊兒再寫一遍,不然默認值約束會丟失

默認值約束:default

建表時指定默認約束

create table 【數據名.】表名(
  字段名1 數據類型 primary key ,
  字段名2 數據類型 【unique key】 【not null】 【default 默認值】,
  字段名3 數據類型 【not null】 【default 默認值】,
  ....,
);

建表後指定默認值約束

ALTER TABLE 表名稱 MODIFY 字段名 數據類型 【default 默認值】 【NOT NULL】;

#若是該字段原來設置了非空約束,要跟着一塊兒再寫一遍,不然非空約束會丟失

刪除默認值約束

ALTER TABLE 表名稱 MODIFY 字段名 數據類型 【NOT NULL】;

#若是該字段原來設置了非空約束,要跟着一塊兒再寫一遍,不然非空約束會丟失

檢查約束,mysql暫不支持

自增約束:auto_increment

特色:

  • 一個表最多隻能有一個自增加列

  • 自增加列必須是鍵列(主鍵列,惟一鍵列,外鍵列),而且要求非空。

  • 自增列必須是整數類型

  • InnoDB表的自動增加列能夠手動插入,可是插入的值若是是空或者0,則實際插入的將是自動增加後的值。

建表時指定自增加

create table 【數據名.】表名(
  字段名1 數據類型 primary key auto_increment,
  字段名2 數據類型 【unique key】 【not null】 【default 默認值】,
  ....
);
或
create table 【數據名.】表名(
  字段名1 數據類型 primary key ,
  字段名2 數據類型 【unique key not null】 auto_increment,
  ....
);

建表後指定自增加

alter table 【數據名.】表名 modify 自增字段名 數據類型 auto_increment;

刪除自增約束

alter table 【數據名.】表名 modify 自增字段名 數據類型;

添加數據時,若是某列有自增約束,怎麼添加該字段的值

insert into 【數據庫名.]表名稱 values(值列表);#在值列表中,對應自增列能夠賦值爲null和0
insert into 【數據庫名.]表名稱(部分字段列表) values(值列表);#自增列在(部分字段列表)中不寫就能夠

添加數據時,若是某列有默認值約束,怎麼添加、修改該字段的值

insert into 【數據庫名.]表名稱 values(值列表);#在值列表中,對應默認值列,若是想用默認值,用default

insert into 【數據庫名.]表名稱(部分字段列表) values(值列表);#對應默認值列,若是想用默認值,在(部分字段列表)中不寫就能夠

修改數據

update 【數據庫名.]表名稱 set 字段名1 = 值1, 字段名2 = 值2 。。。 【where 條件】; #對應默認值列,若是想用默認值,寫字段名 = default就能夠
相關文章
相關標籤/搜索