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

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

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

二、約束類型

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

三、NOT NULL 非空約束

定義表時某列不允許為NULL時,可以為列添加非空約束。如果預(yù)見某個列不能為空,強(qiáng)烈建議加非空約束,會對查詢性能產(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è)置值,那么會將默認(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 ('張三');
-- 手動指定年齡值
insert into student (`name`,age) values ('李四',19);
-- 也可以指定為null
insert into student (`name`,age) values ('王五',null);

五、UNIQUE 唯一約束

指定了唯一約束的列,該列的值在所有記錄中不能重復(fù),比如?個?的身份證號,學(xué)生的學(xué)號等。如果預(yù)見某個列不能為空,強(qiáng)烈建議加非空約束,會對查詢性能產(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,'李四');

唯一約束只會約束列值是否唯一,并不會約束空值,也就是我們可以寫入多個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ù)據(jù)庫表中的每條記錄
  • 主鍵必須包含唯一的值,且不能包含 NULL 值
  • 每個表只能有一個主鍵,可以由單個列或多個列組成
  • 通常為每張表都指定?個主鍵,主鍵列建議使?BIGINT類型
create table student(
  id bigint primary key,
  `name` varchar(25) not null
);
desc student;

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

通常把主鍵列設(shè)置為自動增長,讓數(shù)據(jù)庫維護(hù)主鍵值,這樣我們寫入數(shù)據(jù)時,不用人為的去維護(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 ('李明');

一個表中不能包含多個主鍵

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

一個主鍵可以包含多個列

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

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

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ù)必須在主表的主鍵或唯?列存在或為null。

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

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

-- 創(chuàng)建班級表
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;

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

八、Check 約束

應(yīng)用于?個或多個列,用于限制列中可接受的數(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; 

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

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

相關(guān)文章

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

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

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

    mysql約束和高級sql詳解

    文章介紹了MySQL中的約束類型(如主鍵、外鍵、唯一約束、非空約束、檢查約束、默認(rèn)值和自增)以及高級SQL功能(如子查詢、連接、事務(wù)和存儲過程),感興趣的朋友一起看看吧
    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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • mysql踩坑之count distinct多列問題

    mysql踩坑之count distinct多列問題

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

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

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

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

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

    MySQL 各個索引的使用詳解

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

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

    這篇文章主要介紹了mysql數(shù)據(jù)遷徙方法工具解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    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

最新評論