刪除列級完整性約束 MySQL中的資料完整性約束

2021-10-16 18:33:51 字數 3780 閱讀 4012

前面已經學習了常用資料型別和表的操作,其中表的操作中提到了資料完整性約束條件,今天來詳細說一下各種完整性約束條件。

關係模型的完整性規則是對關係的某種約束條件。對關係模型施加完整性約束,是為了在資料庫應用中保障資料的正確性和一致性,防止資料庫中存在不符合語義、不正確的資料,這也是資料庫伺服器最重要的功能之一。

完整性約束既能防止對mysql資料庫的以外破壞和非法訪問,又能提高完整性檢測效率,也能減輕我們的負擔。下面說一下關係模型中的三類完整性約束。

定義實體完整性

實體完整性規則(entity integrity rule)是指關係的主屬性不能取空值,即主鍵和候選鍵在關係中所對應的屬性都不能取空值。mysql中實體完整性就是通過主鍵約束和候選鍵約束來實現的。

1、主鍵約束

主鍵是表中某一列或某些列所構成的乙個組合。能夠唯一地標識表中的一條記錄。主鍵約束(primary key constraint)要求主鍵列的資料唯一,且不允許為空。

主鍵約束實現的兩種方式:

一種是列級完整性約束,在表中某個字段定義後加上關鍵字primary key即可。如studentno char(10) primary key,。

一種是表級完整性約束,需要在表中所有字段定義最後新增一條primary key(index_col_name, ...)。如primary key(studentno)。

比如我們重新建立學生表:

create table tb_student(

studentno char(10) primary key,

studentname varchar(20) not null,

*** char(2),

birthday date,

native varchar(20),

nation varchar(20),

classno char(6)

)engine=innodb;

2、完整性約束的命名

與資料庫中的表一樣,可以對完整性約束進行新增、刪除和修改等操作。首先需要在定義約束時對其進行命名,命名完整性約束的方法是,在各種完整性約束的定義說明之前加關鍵字constraint和該約束的名字,語法格式如下:

constraint

;說明:symbol為指定的約束名字,必須是唯一的,預設mysql會自動建立乙個約束名字。

3、候選鍵約束

與主鍵一樣,候選鍵可以是表中的某一列,也可以是表中某些列構成的乙個組合。任何時候,候選鍵的值必須是唯一的,且不能為null,候選鍵可在create table 或alter table語句中使用關鍵字unique來定義,實現方法與主鍵類似。看乙個例子,建立班級表。

create table tb_class(

classno char(6) primary key,

classname varchar(20) not null unique,

department varchar(30) not null,

grade smallint,

classnum tinyint

)engine=innodb;

或者直接放在所有字段之後:constraint uq_class unique(classname)。

mysql中primary key 和unique之間的區別:

乙個表只能建立乙個primary key,但是可以定義多個unique。

定義primary key的列不允許有空值,定義unique的字段允許空值的存在。

定義primary key約束時,系統會自動產生primary key索引,而定義unique約束時,系統自動產生unique索引。

定義參照完整性

關係模型中實體與實體間的聯絡都是用關係來描述,因此可能存在著關係與關係間的引用。外來鍵是乙個表中的乙個或一組屬性,他不是這個表的主鍵,但是它對應另乙個表的主鍵,外來鍵的主要作用就是保證資料引用的完整性,保持資料的一致性。

參照完整性規則(referential integrity rule)定義的是外來鍵與主鍵之間的引用規則,即外來鍵的取值或者為空,或者等於被參照關係中某個主鍵的值。

下面修改一下前面的學生表。

drop table tb_student;

create table tb_student(

studentno char(10),

studentname varchar(20) not null,

*** char(2),

birthday date,

native varchar(20),

nation varchar(20),

classno char(6) references tb_class(classno),

constraint pk_student primary key(studentno)

)engine=innodb;

前面已經建立了表tb_class,而且classno是主鍵,這裡學生表裡可以設定為外來鍵,這個值參照班級表的主鍵classno的值。

ps.外來鍵只能引用主鍵和候選鍵。外來鍵只可以用在使用儲存引擎innodb建立的表中,其他的儲存引擎不支援外來鍵。

使用者定義的完整性

除了前面兩種完整性之外,還有一種特殊的約束條件,即使用者定義的完整性規則(user-definedintegrity rule),它反映了某一具體應用所涉及的資料應滿足的語義要求。

mysql支援以下幾種使用者自定義完整性約束:

1、設定非空約束

非空約束是指設定的字段的值不能為空。比如之前我們新增的字段:studentnamevarchar(20) not null,中就設定了非空約束。

2、check約束

與非空約束一樣,也是在建立表或修改表的同時來定義的。check約束需要指定限定條件,check的語法是check(expr);下面看一下例項,我們來建立乙個課程表tb_course,並且設定約束,每16個課時對應1學分。

create table tb_course(

courseno char(10),

coursename varchar(20) not null,

credit int not null,

coursehour int not null,

term char(2),

priorcourse char(6),

constraint pk_course primary key(courseno),

constraint fk_course foreign key(priorcourse)

references tb_course(courseno),

constraint ck_course check(credit= coursehour/16)

)engine=innodb;

更新完整性約束

1、刪除約束

drop table會刪除所有完整性,但是並不經常這樣做。看一下單獨刪除的語法。

刪除外來鍵約束

alter table drop foreign key ;

刪除主鍵約束

alter table drop primary key;

刪除候選鍵約束

alter table drop ;

2、新增約束

新增主鍵約束

alter table add [constraint] primary key(主鍵字段);

新增外來鍵約束

alter table add [constraint] foreignkey (外來鍵字段) references 被參照表(主鍵欄位名);

新增候選鍵約束

alter table add [constraint] unique key(欄位名);

MySQL完整性約束

create database adrui show databases use adrui not null 非空約束,插入資料該欄位不能為空 primary key 主鍵約束 主鍵約束相當於非空約束 唯一約束,auto increment是mysql擴充套件的字段值自加的約束,約束字段資料型別必...

Mysql 完整性約束

定義 完整性約束是對字段進行限制,從而符合該欄位達到我們期望的效果比如字段含有預設值,不能是null等,主要有唯 一 自增 主鍵 外來鍵約束 唯一約束 唯一約束可以有多個但索引列的值必須唯一,索引列的值允許有空值。如果能確定某個資料列將只包含彼此各不相同的值,在為這個資料列建立索引的時候就應該使用關...

MySql中的完整性約束

列級約束 對乙個資料列建立的約束 表級約束 對多個資料列建立的約束 列級約束既可以在定義時宣告,也可以在定以後宣告。表級約束只能在列定義後宣告。mysql中的完整性約束主要包括下面這些 not null 非空約束,當我們給某個字段新增非空約束後,我們新增的記錄的時候,就必須給該字段賦值,如果不賦值則...