前言
MySQL約束是用于在關(guān)系型數(shù)據(jù)庫中定義和實施數(shù)據(jù)完整性規(guī)則的規(guī)范。它們定義了數(shù)據(jù)庫表中數(shù)據(jù)的限制條件,確保數(shù)據(jù)的一致性和有效性。
今天我將為大家分享以下約束:
- 主鍵約束(primary key)
- 自增長約束(auto_incremnet)
- 非空約束(not null)
- 唯一性約束(unique)
- 默認約束(default)
- 零填充約束(zerofill)
- 外鍵約束(foreign key)
主鍵約束
MySQL主鍵約束是一種用于保證表中數(shù)據(jù)唯一性和完整性的約束類型。主鍵是一個或多個列的組合,用于標(biāo)識表中的唯一記錄。主鍵約束要滿足以下條件:
-
唯一性:主鍵的值在整個表中必須是唯一的。任意兩個記錄都不能具有相同的主鍵值。
-
非空性:主鍵的值不能為空。每個記錄都必須具有一個非空的主鍵值。
-
唯一標(biāo)識:主鍵作為表中每個記錄的唯一標(biāo)識。它可以用來在表中查找、更新和刪除記錄。
當(dāng)創(chuàng)建主鍵約束時,系統(tǒng)默認會在所在的列和列組合上建立對應(yīng)的唯一索引。
創(chuàng)建主鍵
主鍵有兩種形式,一種是單列主鍵,第二種是聯(lián)合主鍵。
單列主鍵
MySQL中創(chuàng)建單列主鍵有兩種方式:一種是在我們創(chuàng)建表的時候,在對應(yīng)列的后面指定主鍵,另外一種就是我們在創(chuàng)建完列之后指定主鍵
在創(chuàng)建表的時候指定主鍵
create table student1(id int primary key,name varchar(20));
在創(chuàng)建列之后指定主鍵
create table student1(id int,name varchar(20),constraint pk1 primary key(id));
這里 contrain pk1
可以省略,這種是 primary key
的完整寫法,pk1 是約束名,可以自定義。
聯(lián)合主鍵
聯(lián)合主鍵是指將表中的多個列共同當(dāng)作主鍵,可以出現(xiàn)某個列相同,但不允許所有對應(yīng)的列都相同,并且不能含有null。
創(chuàng)建聯(lián)合主鍵只有一種方法:create table 表名(列名1 類型,列名2 類型,列名3 類型,constraint pk2 primary key(列名1,列名2));
create table student1(id int,name varchar(20),constraint pk1 primary key(id,name));
當(dāng)出現(xiàn)某一列重復(fù)的時候,可以插入數(shù)據(jù),但是當(dāng)聯(lián)合主鍵的對應(yīng)列都相同的時候就插入失敗。
insert into studen1 values(1,'張三');
insert into studen1 values(1,'李四');
insert into student1 values(2,'王五');
insert into student1 values(2,'王五');
任何一列都不能出現(xiàn)null
insert into student1 values(3,null);
通過修改表結(jié)構(gòu)來指定主鍵
我們可以在創(chuàng)建完成表之后再指定主鍵 alter table 表名 add primary key(列名);
alter table 表名 add primary key(列名1,列名2)
create table student1(id int,name varchar(20));
alter table student1 add primary key(id);
create table student1(id int,name varchar(20));
alter table student1 add primary key(id,name);
刪除主鍵約束
當(dāng)不想使用主鍵的時候,可以使用 alter table 表名 drop primary key;
刪除主鍵。
刪除主鍵的時候,不管你是單列主鍵還是聯(lián)合主鍵都使用 alter table 表名 drop primary key;
自增主鍵約束
MySQL自增主鍵是一種特殊類型的主鍵約束,它使用自動遞增的值為每個新插入的記錄生成唯一的標(biāo)識符。自增主鍵允許無需手動指定主鍵值即可向表中插入記錄,并確保每個記錄都具有唯一的標(biāo)識符。
使用自增主鍵具有以下優(yōu)點:
-
簡化數(shù)據(jù)插入:無需手動指定主鍵值,數(shù)據(jù)庫會自動為每個新插入的記錄分配一個唯一的主鍵值。這簡化了插入操作的編碼工作,并減少了出現(xiàn)沖突的可能性。
-
唯一性保證:自增主鍵的值在表中是唯一的,避免了手動管理主鍵沖突的問題。
-
快速訪問:自增主鍵的值按順序遞增,這有助于提高基于主鍵的查詢和索引操作的性能。
自增主鍵的特點:
- 默認情況下, auto_increment 的初始值是 1 ,每新增一條記錄,字段值自動加 1
- 一個表中只能有一個字段使用 auto_increment 約束,且該字段必須有唯一索引,以避免序號重復(fù)(即為主鍵或主鍵的一部分)。
- auto_increment 約束的字段必須具備 NOT NULL 屬性。
- auto_increment 約束的字段只能是整數(shù)類型( TINYINT 、 SMALLINT 、 INT 、 BIGINT 等。
- auto_increment 約束字段的最大值受該字段的數(shù)據(jù)類型約束,如果達到上限, auto_increment 就會失效。
創(chuàng)建自增主鍵
因為自增主鍵是特殊的主鍵,所以主鍵和自增主鍵需要指定到同一列中。
create table 表名 (列名1 類型 primary key auto_increment,列名2 類型);
create table student1(id int primary key auto_increment,name varchar(20));
當(dāng)某一列被設(shè)置為自增主鍵時,我們插入數(shù)據(jù)的時候,可以傳入null,該列數(shù)據(jù)會被默認為從1開始的自增數(shù)據(jù)(在沒有定義自增初值的時候)。
insert into student1 values(null,'張三');
為自增主鍵賦初值
我們可以指定自增數(shù)據(jù)從哪開始,為自增數(shù)據(jù)指定初值。
create table student1(id int primary key auto_increment,name varchar(20)) auto_increment=值;
create table student1(id int primary key auto_increment,name varchar(20)) auto_increment=100;
insert into student1 values(null,'張三');
在創(chuàng)建表之后為自增主鍵賦初值
alter table 表名 auto_increment=初始值;
create table student1(id int primary key auto_increment,name varchar(20));
alter table student1 auto_increment=100;
insert into student1 values(null,'張三');
delete 和 truncate 在刪除后自增列的變化
- delete 數(shù)據(jù)之后自動增長從斷點開始
- truncate 數(shù)據(jù)之后自動增長從默認起始值開始
insert into student1 values(null,'張三');
insert into student1 values(null,'李四');
delete from student1;
insert into student1 values(null,'王五');
truncate student1;
insert into student1 values(null,'李華');
非空約束
MySQL非空約束是一種用于確保表中某列不允許包含空值(NULL)的約束類型。非空約束要求在插入或更新數(shù)據(jù)時,該列必須包含有效的值。非空約束可以應(yīng)用于單個列或多個列。
創(chuàng)建非空約束
MySQL創(chuàng)建非空約束有兩種方式:第一種是我們在創(chuàng)建表的時候指定非空約束create table 表名(列名1 類型 not null,列名2 類型);
第二種就是我們創(chuàng)建完成表之后指定非空約束 alter table 表名 modify 列名 類型 not null;
create table student1(id int not null,name varchar(20));
desc student1;
create table student1(id int,name varchar(20));
alter table student1 modify id int not null;
desc student1;
insert into student1 values(null,'張三');
刪除非空約束
alter table 表名 modify 列名 類型;
alter table student1 modify id int;
desc student1;
唯一約束
MySQL唯一約束是一種用于確保表中某列或多列的數(shù)據(jù)是唯一的約束類型。唯一約束保證了列中的值都是互不相同的,但允許包含一個或多個空值(NULL)。
創(chuàng)建唯一約束
MySQL中創(chuàng)建唯一約束同樣有兩種方法:創(chuàng)建表時指定唯一約束:create table 表名(列名1 類型 unique,列名2 類型);
創(chuàng)建表之后指定唯一約束:alter table 表名 add constraint unique_pn unique(列名);
這里constraint 約束名 不省略,為后面的刪除唯一約束做準(zhǔn)備。
create table student1(id int constraint unique_pn unique,name varchar(20));
insert into student1 values(1,'張三');
insert into student1 values(1,'李四');
create table student1(id int,name varchar(20));
alter table student1 add constraint unique_pn unique(id);
insert into student1 values(1,'張三');
insert into student1 values(1,'李四');
刪除唯一性約束
刪除唯一性約束的時候需要用到我們前面定義的約束名。alter table 表名 drop index 唯一約束名
alter table student1 drop index unique_pn;
如果你前面沒有定義唯一約束名,那么默認就是你設(shè)置唯一約束的列名。
默認約束
MySQL默認約束是在創(chuàng)建表時,為表中的某個列定義的一個默認值規(guī)則。當(dāng)插入新的記錄時,如果未顯式提供該列的值,MySQL會自動將默認值應(yīng)用于該列。默認約束可以是一個具體的值,也可以是一個表達式、函數(shù)或系統(tǒng)變量。
創(chuàng)建默認約束
我們MySQL默認的默認約束是null,那么我們也可以自己設(shè)置默認值。在創(chuàng)建表的同時指定默認約束: create table 表名(id int default 默認值,name varchar(20) default 默認值);
在創(chuàng)建表之后指定默認約束 alter table 表名 modify 列名 default 默認值;
create table student1(id int,name varchar(20) default '無名氏');
desc student1;
alter table student1 modify name default '無名氏';
刪除默認約束(改為null為默認值)
alter table 表名 類型 modify 列名 default null;
alter table student1 varchar(20) modify name default null;
零填充約束
MySQL零填充約束是一種用于整型數(shù)據(jù)列的約束,它定義了在插入或更新數(shù)據(jù)時如何處理數(shù)值長度不足的情況。當(dāng)一個整型數(shù)據(jù)列的數(shù)值長度小于定義的長度時,MySQL會使用零填充方式來補足。
- 插入數(shù)據(jù)時,當(dāng)該字段的值的長度小于定義的長度時,會在該值的前面補上相應(yīng)的 0
- zerofill 默認為 int(10)
- 當(dāng)使用 zerofill 時,默認會自動加 unsigned (無符號)屬性,使用 unsigned 屬性后,數(shù)值范圍是原值的 2 倍,例如,有符號為 -128 ~ +127 ,無符號為 0 ~ 256
創(chuàng)建零填充約束
create table 表名(列名1 類型(指定寬度) zerofill,列名2 類型);
create table student1(id int(5) zerofill,name varchar(20));
insert into student1 values(1,'張三')
刪除零填充約束
alter table 表名 modify 列名 類型;
alter table student1 modify id int;
insert into student1 values(2,'李四');
零填充約束只是顯示的時候是用0填充的,但是加上表中的內(nèi)容沒有變化。
外鍵約束
在學(xué)校中,我們都知道每個學(xué)生都有對應(yīng)的班級,同樣在MySQL中也可以將這種類似的關(guān)系體現(xiàn)出來。
外鍵用于關(guān)聯(lián)其他表的主鍵或唯一鍵
創(chuàng)建外鍵約束
create table 表名 (列名 類型 foreign key (列名) references 另一個表名(關(guān)聯(lián)的列名));
create table class (classId int primary key auto_increment,name varchar(20));
create table student (studentId int primary key auto_increment,name varchar(20),classId int,
foreign key (classId) references class(classId));
desc student;
既然是學(xué)生,那么肯定要先有班級然后學(xué)生才能進入班級,并且學(xué)生不能進入不存在的班級。
insert into class (null,'高三1班');
insert into class values (null,'高三2班');
insert into class values (null,'高三3班');
insert into student values (null,'張三',1);
insert into student values (null,'李四',4);
刪除外鍵約束
當(dāng)插入的數(shù)據(jù)在外鍵對應(yīng)的列中不含有時,就會報錯。并且在以上的外鍵關(guān)系中,class為父表,student為子表,子表的插入和刪除都受到父表的約束,同時父表的刪除也受到子表的約束。文章來源:http://www.zghlxwxcb.cn/news/detail-623837.html
update student set classId = 5;
delete from class where classId = 1;
子表的修改,對應(yīng)的列修改后的數(shù)據(jù)還是需要在父表中存在。父表刪除的時候,如果子表與其有關(guān)聯(lián),那么就刪除不了,只能先刪除掉子表的對應(yīng)行,然后再刪除父表。文章來源地址http://www.zghlxwxcb.cn/news/detail-623837.html
到了這里,關(guān)于MySQL數(shù)據(jù)庫——約束的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!