最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

二、約束類型

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

三、NOT NULL 非空約束

定義表時某列不允許為NULL時,可以為列添加非空約束。如果預見某個列不能為空,強烈建議加非空約束,會對查詢性能產(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表示當前列可以為空,NO表示當前列不可以為空。

desc student;

四、DEFAULT 默認值約束

DEFAULT約束用于向列中插入默認值,如果沒有為列設置值,那么會將默認值設置到該列。

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

五、UNIQUE 唯一約束

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

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

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

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

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,'王強');
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;

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

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)的列必須是主鍵或唯一約束
  • 當定義外鍵后,要求從表中的外鍵列數(shù)據(jù)必須在主表的主鍵或唯?列存在或為null。

之所以要使用外鍵,是因為外鍵可以更方便地維護數(shù)據(jù),比如上圖中班級編號就可以簡化為1個數(shù)字,又比如在填表過程中填到一半,系統(tǒng)出現(xiàn)了崩潰,導致數(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)建學生表
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 約束

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

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ù)庫約束深入詳解的詳細內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)庫約束的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Linux搭建單機MySQL8.0.26版本的操作方法

    Linux搭建單機MySQL8.0.26版本的操作方法

    這篇文章主要介紹了Linux搭建單機MySQL8.0.26版本的操作方法,本文通過圖文并茂的形式給大家講解的非常詳細,感興趣的朋友一起看看吧
    2025-05-05
  • MySQL安裝提示配置信息已損壞請聯(lián)系技術(shù)人員

    MySQL安裝提示配置信息已損壞請聯(lián)系技術(shù)人員

    為了重新安裝MySql,看別人的博客說在注冊表中搜索mysql,全部刪除。再安裝時提示配置信息已損壞,遇到這個問題怎么處理呢,下面小編給大家?guī)砹嗽敿毥鉀Q方法,感興趣的朋友一起看看吧
    2023-01-01
  • MySQL之死鎖問題及其解決方案

    MySQL之死鎖問題及其解決方案

    數(shù)據(jù)庫死鎖問題是我們老生常談的問題了,在我們實際開發(fā)過程中經(jīng)常會遇到,本文主要介紹了MySQL之死鎖問題及其解決方案,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEM

    MySQL:Unsafe statement written to the binary log using state

    這篇文章主要介紹了MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEM,需要的朋友可以參考下
    2016-05-05
  • MySQL 鎖機制從原理到實踐深度解析

    MySQL 鎖機制從原理到實踐深度解析

    MySQL 作為主流關(guān)系型數(shù)據(jù)庫,其鎖機制設計精巧卻也復雜,理解鎖的工作原理對解決并發(fā)問題至關(guān)重要,這篇文章主要介紹了MySQL 鎖機制從原理到實踐深度解析,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-11-11
  • 關(guān)于Mysql查詢帶單引號及插入帶單引號字符串問題

    關(guān)于Mysql查詢帶單引號及插入帶單引號字符串問題

    本文主要介紹的是用mysql_real_escape_string對用戶提交的表單數(shù)據(jù)進行轉(zhuǎn)義處理和通過addslashes以及mysql_escape_string這3個類似功能的函數(shù)用法區(qū)別
    2013-04-04
  • MySQL8中隱藏索引與降序索引的新特性

    MySQL8中隱藏索引與降序索引的新特性

    本文主要介紹了MySQL8中隱藏索引與降序索引的新特性,隱藏索引和降序索引為數(shù)據(jù)庫的性能優(yōu)化和靈活性提供了有力支持,感興趣的可以了解一下
    2024-08-08
  • MySQL?中的?LIMIT?語句及基本用法

    MySQL?中的?LIMIT?語句及基本用法

    LIMIT?語句用于限制查詢返回的行數(shù),常用于分頁查詢或取部分數(shù)據(jù),提高查詢效率,本文給大家介紹MySQL?中的?LIMIT?語句,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-06-06
  • mysql聲明游標的方法

    mysql聲明游標的方法

    在本篇文章里小編給大家整理的是關(guān)于mysql聲明游標的方法和實例內(nèi)容,需要的朋友們可以參考下。
    2020-09-09
  • mysql添加enum類型的字段實現(xiàn)

    mysql添加enum類型的字段實現(xiàn)

    Enum類型它允許我們在一個有限的選項列表中選擇一個值,本文主要介紹了mysql添加enum類型的字段實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01

最新評論

兖州市| 正镶白旗| 武夷山市| 上栗县| 涟水县| 延吉市| 普兰店市| 德州市| 新泰市| 泸西县| 陆川县| 梅河口市| 宁陵县| 溧水县| 曲靖市| 梨树县| 依安县| 大渡口区| 老河口市| 定兴县| 逊克县| 汶川县| 正宁县| 吐鲁番市| 汉川市| 湘潭市| 江西省| 侯马市| 富锦市| 五原县| 忻州市| 沧州市| 武定县| 五大连池市| 屯门区| 黎城县| 台南县| 桑植县| 秦皇岛市| 敦化市| 新泰市|