欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL數(shù)據(jù)庫約束深入詳解

 更新時(shí)間:2025年05月01日 12:05:30   作者:手握風(fēng)云-  
這篇文章主要介紹了MySQL數(shù)據(jù)庫約束,在MySQL數(shù)據(jù)庫中,約束是用來限制進(jìn)入表中的數(shù)據(jù)類型的一種技術(shù),通過使用約束,可以確保數(shù)據(jù)的準(zhǔn)確性、完整性和可靠性,需要的朋友可以參考下

一、數(shù)據(jù)庫約束的概念

數(shù)據(jù)庫約束是指對(duì)數(shù)據(jù)庫表中的數(shù)據(jù)所施加的規(guī)則或條件,用于確保數(shù)據(jù)的準(zhǔn)確性和可靠性。這些約束可以是基于數(shù)據(jù)類型、值范圍、唯?性、非空等規(guī)則,以確保數(shù)據(jù)的正確性和相容性。如果出現(xiàn)了一些錯(cuò)誤,人工檢查的工作量非常大,于是在數(shù)據(jù)庫中定義了一些約束,讓數(shù)據(jù)庫幫我們自動(dòng)檢測(cè)。

二、約束類型

約束類型說明
NOT NULL非空約束指定非空約束的列不能存儲(chǔ) NULL 值
DEFALUT 默認(rèn)約束當(dāng)沒有給列賦值時(shí)使用的默認(rèn)值
UNIQUE 唯?約束指定唯?約束的列每行數(shù)據(jù)必須有唯?的值
PRIMARY KEY 主鍵約束NOT NULL 和 UNIQUE的結(jié)合,可以指定?個(gè)列或多個(gè)列,有助于防止數(shù)據(jù)重復(fù)和提高數(shù)據(jù)的查詢性能
FOREIGN KEY 外鍵約束外鍵約束是?種關(guān)系約束,用于定義兩個(gè)表之間的關(guān)聯(lián)關(guān)系,可以確保數(shù)據(jù)的完整性和?致性
CHECK 約束用于限制列或數(shù)據(jù)在數(shù)據(jù)庫表中的值,確保數(shù)據(jù)的準(zhǔn)確性和可靠性

三、NOT NULL 非空約束

定義表時(shí)某列不允許為NULL時(shí),可以為列添加非空約束。如果預(yù)見某個(gè)列不能為空,強(qiáng)烈建議加非空約束,會(huì)對(duì)查詢性能產(chǎn)生積極影響。

create table student(
  id bigint default null,
  `name` varchar(25) not null
);
insert into student(id,`name`) values (1,null);

create table student(
  id bigint default null,
  `name` varchar(25) not null
);
insert into student(id,`name`) values (1,'張三');

查看表結(jié)構(gòu),YES表示當(dāng)前列可以為空,NO表示當(dāng)前列不可以為空。

desc student;

四、DEFAULT 默認(rèn)值約束

DEFAULT約束用于向列中插入默認(rèn)值,如果沒有為列設(shè)置值,那么會(huì)將默認(rèn)值設(shè)置到該列。

create table student(
  id bigint primary key auto_increment,
  `name` varchar(20) not null,
  age int default 18
);
-- 不指定使用默認(rèn)值
insert into student (`name`) values ('張三');
-- 手動(dòng)指定年齡值
insert into student (`name`,age) values ('李四',19);
-- 也可以指定為null
insert into student (`name`,age) values ('王五',null);

五、UNIQUE 唯一約束

指定了唯一約束的列,該列的值在所有記錄中不能重復(fù),比如?個(gè)?的身份證號(hào),學(xué)生的學(xué)號(hào)等。如果預(yù)見某個(gè)列不能為空,強(qiáng)烈建議加非空約束,會(huì)對(duì)查詢性能產(chǎn)生積極影響。

create table student(
  id bigint unique,
  `name` varchar(25) not null
);
insert into student(id,`name`) values (1,'張三');
insert into student(id,`name`) values (1,'李四');

create table student(
  id bigint unique,
  `name` varchar(25) not null
);
insert into student(id,`name`) values (1,'張三');
insert into student(id,`name`) values (2,'李四');

唯一約束只會(huì)約束列值是否唯一,并不會(huì)約束空值,也就是我們可以寫入多個(gè)null。

insert into student(id,`name`) values (null,'王五1');
insert into student(id,`name`) values (null,'王五2');
insert into student(id,`name`) values (null,'王五3');
select * from student;

六、PRIMARY KEY 主鍵約束

  • 主鍵約束唯一標(biāo)識(shí)數(shù)據(jù)庫表中的每條記錄
  • 主鍵必須包含唯一的值,且不能包含 NULL 值
  • 每個(gè)表只能有一個(gè)主鍵,可以由單個(gè)列或多個(gè)列組成
  • 通常為每張表都指定?個(gè)主鍵,主鍵列建議使?BIGINT類型
create table student(
  id bigint primary key,
  `name` varchar(25) not null
);
desc student;

那如果說,某一列要求為非空且唯一,我們可不可以將其設(shè)置為主鍵呢?是不可以的,因?yàn)橹麈I是數(shù)據(jù)表的一個(gè)特性,數(shù)據(jù)如何組織依賴于主鍵這個(gè)特性;而非空且唯一是業(yè)務(wù)規(guī)則。

通常把主鍵列設(shè)置為自動(dòng)增長(zhǎng),讓數(shù)據(jù)庫維護(hù)主鍵值,這樣我們寫入數(shù)據(jù)時(shí),不用人為的去維護(hù)主鍵值,只需要寫入業(yè)務(wù)值即可。

create table student(
  id bigint primary key auto_increment,
  `name` varchar(25) not null
);
desc student;

insert into student(`name`) values ('張三');
insert into student(`name`) values ('李四');
insert into student(`name`) values ('王五');
select * from student;

主鍵值也可以不連續(xù)

insert into student(id,`name`) values (100,'趙六');
select * from student;

還可以再插入100以下的數(shù)據(jù)。

insert into student(id,`name`) values (4,'王強(qiáng)');
select * from student;

下一次自增按照最大值自增。

insert into student(`name`) values ('李明');

一個(gè)表中不能包含多個(gè)主鍵

create table student(
  id bigint primary key,
  sno varchar(20) primary key,
  name varchar(20) not NULL
);

一個(gè)主鍵可以包含多個(gè)列

create table student(
  sno varchar(20),
  `name` varchar(20),
  gender bool,
  primary key(sno,`name`)
);
desc student;

多個(gè)主鍵列的值組合在一起,可以作為重復(fù)校驗(yàn)的條件

insert into student(sno,`name`,gender) values ('1','張三',1);
insert into student(sno,`name`,gender) values ('1','李四',1);
insert into student(sno,`name`,gender) values ('1','張三',1);

七、FOREIGN KEY 外鍵約束

  • 外鍵?于定義主表和從表之間的關(guān)系
  • 外鍵約束主定義在從表的列上,主表關(guān)聯(lián)的列必須是主鍵或唯一約束
  • 當(dāng)定義外鍵后,要求從表中的外鍵列數(shù)據(jù)必須在主表的主鍵或唯?列存在或?yàn)閚ull。

之所以要使用外鍵,是因?yàn)橥怄I可以更方便地維護(hù)數(shù)據(jù),比如上圖中班級(jí)編號(hào)就可以簡(jiǎn)化為1個(gè)數(shù)字,又比如在填表過程中填到一半,系統(tǒng)出現(xiàn)了崩潰,導(dǎo)致數(shù)據(jù)不全。

外鍵約束也是對(duì)數(shù)據(jù)的一種校驗(yàn),從表中使用了主表中的某個(gè)值,這個(gè)值必須存在于主表中。

-- 創(chuàng)建班級(jí)表
create table class(
  id bigint primary key auto_increment,
  `name` varchar(20) not null
);
insert into class (`name`) values ('1001'),('1002'),('1003'),('2001'),('2002');
select * from class;
-- 創(chuàng)建學(xué)生表
create table student(
  id bigint primary key auto_increment,
  `name` varchar(20) not null,
  age int,
  class_id bigint,
  foreign key (class_id) references class(id)
);
desc student;

insert into student (`name`,age,class_id) values ('張三',18,1);

insert into student (`name`,age,class_id) values ('李四',18,6);

insert into student (`name`,age,class_id) values ('張三',18,1);
insert into student (`name`,age,class_id) values ('李四',18,1);
insert into student (`name`,age,class_id) values ('王五',19,2);
insert into student (`name`,age,class_id) values ('趙六',17,3);
insert into student (`name`,age,class_id) values ('錢七',17,3);
delete from class where id = 3;

刪除主表時(shí)如果從表中有對(duì)從表的引用,則不被允許刪除。要非得刪除,就先得解除從表對(duì)主表的引用。

八、Check 約束

應(yīng)用于?個(gè)或多個(gè)列,用于限制列中可接受的數(shù)據(jù)值,從而確保數(shù)據(jù)的完整性和準(zhǔn)確性。

create table student(
  id bigint PRIMARY KEY auto_increment,
  `name` varchar(20) not null,
  age int DEFAULT 18,
  gender char(1),
  check (age >= 16),
  check(gender = '男' or gender = '女')
);
desc student;

-- 正常插入數(shù)據(jù)
insert into student (`name`,age,gender) values ('張三',17,'男'),('李四',19,'女');
select * from student; 

-- 錯(cuò)誤插入數(shù)據(jù)
insert into student (`name`,age,gender) values ('王五',15,'男');

以上就是MySQL數(shù)據(jù)庫約束深入詳解的詳細(xì)內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)庫約束的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL日期時(shí)間類型與字符串互相轉(zhuǎn)換的方法

    MySQL日期時(shí)間類型與字符串互相轉(zhuǎn)換的方法

    這篇文章主要介紹了MySQL日期時(shí)間類型與字符串互相轉(zhuǎn)換的方法,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07
  • mysql約束和高級(jí)sql詳解

    mysql約束和高級(jí)sql詳解

    文章介紹了MySQL中的約束類型(如主鍵、外鍵、唯一約束、非空約束、檢查約束、默認(rèn)值和自增)以及高級(jí)SQL功能(如子查詢、連接、事務(wù)和存儲(chǔ)過程),感興趣的朋友一起看看吧
    2024-11-11
  • redhat 5.4下安裝MYSQL全過程

    redhat 5.4下安裝MYSQL全過程

    自己需要的是用JAVA環(huán)境而不是用php+apache這種一鍵安裝的東西,所以果斷自己來安裝自己想要的東西了,下面與大家分享下redhat 5.4下安裝MYSQL全過程,感興趣的朋友可以參考下哈
    2013-06-06
  • 詳解MySql如何不插入重復(fù)數(shù)據(jù)

    詳解MySql如何不插入重復(fù)數(shù)據(jù)

    本文主要介紹了詳解MySql如何不插入重復(fù)數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • mysql踩坑之count distinct多列問題

    mysql踩坑之count distinct多列問題

    這篇文章主要介紹了mysql踩坑之count distinct多列問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Mysql大數(shù)據(jù)量查詢優(yōu)化思路詳析

    Mysql大數(shù)據(jù)量查詢優(yōu)化思路詳析

    這篇文章主要介紹了Mysql大數(shù)據(jù)量查詢優(yōu)化思路,Mysql大表查詢優(yōu)化,理論上千萬級(jí)別以下的數(shù)據(jù)量Mysql單表查詢性能處理都是可以的。下文我們就來看看具體得思路解析
    2022-01-01
  • mysql5.5中文亂碼問題解決的有用方法

    mysql5.5中文亂碼問題解決的有用方法

    在使用MYSQL時(shí)遇到中文亂碼的問題,表現(xiàn)為插入數(shù)據(jù)后查詢時(shí)輸出為??(亂碼),下面這篇文章主要給大家介紹了關(guān)于mysql5.5中文亂碼問題解決的有用方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • MySQL 各個(gè)索引的使用詳解

    MySQL 各個(gè)索引的使用詳解

    這篇文章主要介紹了MySQL 各個(gè)索引的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Mysql數(shù)據(jù)遷徙方法工具解析

    Mysql數(shù)據(jù)遷徙方法工具解析

    這篇文章主要介紹了mysql數(shù)據(jù)遷徙方法工具解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • MySQL中聚合函數(shù)count的使用和性能優(yōu)化技巧

    MySQL中聚合函數(shù)count的使用和性能優(yōu)化技巧

    這篇文章主要介紹了Windows 10,MySQL版本是5.7.12-log環(huán)境下mysql中聚合函數(shù)count的使用和性能優(yōu)化,需要的朋友可以參考下
    2018-06-06

最新評(píng)論