搜尋
首頁資料庫mysql教程MySQL約束與索引概念是什麼

一、關係型資料庫設計規則

遵循ER模型與三範式

  • E entity 代表實體的意思對應到資料庫當中的一張表

  • R relationship 代表關係的意思

#三範式:

1、列不能拆分

##2 、唯一識別

3、關係引用主鍵

具體體現

  • 將資料放到表中,表再放到庫中。

  • 一個資料庫中可以有多個表,每個表都有一個名字,用來標識自己。表名具有唯一性。

  • 表具有一些特性,這些特性定義了資料在表中如何存儲,類似java和python 中 「類別」的設計。

  • 表格由列組成,我們也稱為欄位。資料表的設計實際上是對各個欄位的含義進行設計和描述。在建立資料表時,需要為每個欄位指定資料類型,定義它們的資料長度和命名。每個欄位類似java 或python中的「實例屬性」。

  • 表中的資料是按行儲存的,一行即為一筆記錄。每一行類似於java或python中的「物件」。

MySQL約束與索引概念是什麼

二、資料完整性與約束與索引的概念

1、資料完整性(Data Integrity)是指數據的精確性(Accuracy)和可靠性(Reliability。這個要點旨在防止資料庫中存在不符合語義規定的數據,同時避免因錯誤訊息的輸入輸出而導致無效操作或錯誤訊息。

數據的完整性要從以下四個方面來考慮:

  • 實體完整性(Entity Integrity):例如,同一個表中,不能存在兩個完全相同無法區分的記錄

  • 域完整性(Domain Integrity):例如:年齡範圍0-120,性別範圍「男/女」

  • 引用完整性(Referential Integrity):例如:員工所在部門,在部門表中要能找到這個部門

  • #使用者自訂完整性(User-defined Integrity):例如:使用者名稱唯一、密碼不能為空等,本部門經理的工資不得高於本部門職工的平均工資的5倍。

2、約束(CONSTRAINTS)

約束是用來將資料業務規則和資料完整性進行實作、維護。約束的作用範圍僅限於目前資料庫,約束可以當作資料庫物件來處理,它們具有名稱和關聯模式,是邏輯約束,不會因為設定約束而額外佔用空間。

3、索引(INDEX)

#索引是一個單獨、物理的儲存在資料頁上的資料庫結構,它是表中一列或若干列值的集合和相應的指向表中資料值的實體識別資料頁的邏輯指標清單(類似新華字典的目錄索引頁)。索引的存在會增加資料庫的儲存空間,也會使插入、修改資料的時間開銷變多(因為插入和修改資料時,索引也要隨之變動),但是可以大幅提高查詢速度。因此應該在鍵列、或其他經常要查詢、排序、按範圍查找的列上建立索引,而對於在查詢中很少使用和參考的列、修改非常頻繁的列,值很少的列(例如性別只有男女)等列上不應該創建索引。

MySQL約束與索引概念是什麼

①Mysql會在主鍵、唯一鍵、外鍵列上自動建立索引,其他欄位需要建立索引的話,需要手動建立。

②主鍵​​刪除,對應的索引也會刪除

③刪除唯一鍵的方式是透過刪除對應的索引來實現的

④刪除外鍵,外鍵列上的索引還在,如果需要刪除,需要單獨刪除索引

#三、約束的應用

1、查看某個表的約束和索引

#查看某个表的约束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
或
SHOW CREATE TABLE 表名;
#查看某个表的索引
SHOW INDEX FROM 表名称;

2、主鍵約束:primary key

(1)主鍵分為單列主鍵和複合主鍵(複合主鍵不建議使用,因為複合主鍵違反三範式。 ):

#单个字段设置主键
create table t_user(
	id int primary key,
    username varchar(20),
    password varchar(20)
);
create table t_user(
	id int,
    username varchar(20),
    password varchar(20),
    primary key(id)
);
#多个字段设置联合主键
drop table t_user;
create table t_user(
	id int,
    username varchar(20),
    password varchar(20),
    primary key(id,username)
);
#了解
#在建表后指定主键约束
alter table 表名称 add primary key (主键字段列表);
#删除主键约束
alter table 表名称 drop primary key;

主鍵的特點:

  • 1、一張表中只能有一個主鍵

  • 2、設定為主鍵的字段的值唯一且非空

  • 3、若主鍵有多個字段組成,此時不能在字段後面設置主鍵,應該在所有字段後面使用"primary key(字段,字段)"

  • 4、聯合主鍵中,組成主鍵的每個字段都非空,可以單獨重複,但是不能同時重複

  • 5、建立主鍵會自動建立對應的索引,同樣刪除主鍵對應的索引也會刪除。

3、自增約束:auto_increment

create table t_user(
	id int primary key auto_increment,
    username varchar(20),
    password varchar(20)
);
#建表后指定自增长列
alter table [数据库.]表名 modify 自增字段名 数据类型 auto_increment;
#删除自增约束
alter table 表名 modify 自增字段名 数据类型;

自增約束的特點:

要求一個表中只有一個主鍵為自增長類型的字段,該字段必須為整數且不能為空。通常只在主鍵上設定鍵約束,如主鍵約束、唯一鍵約束、外鍵約束

2、设置为自增的字段,从1开始自增;每次添加数据,都会在该字段最大值的基础上+1

3、使字段自增的方式:

  • 如果是空或者0,则实际插入的将是自动增长后的值。

  • a> insert into t_user(username,password) values(‘admin’,‘123456’);

  • b> insert into t_user values(null,‘root’,‘123456’); (推荐使用)

  • c> insert into t_user values(0,‘root’,‘123456’);

4、唯一键约束:unique key

create table t_user(
	id int primary key auto_increment,
    username varchar(20) unique key,
    password varchar(20) unique key
);
create table t_user(
	id int primary key auto_increment,
    username varchar(20),
    password varchar(20),
    unique key(username,password)
);
#在建表后增加唯一键约束
alter table 表名称 add 【constraint 约束名】 unique key (字段名列表);
#如果没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,如果是多个字段的默认是字段名列表的第1个字段名。也可以通过show index from 表名;来查看
#删除唯一键约束
ALTER TABLE 表名称 DROP INDEX 唯一性约束名;
#注意:如果忘记名称,可以通过“show index from 表名称;”查看

唯一键约束的特点:

  • 1、设置唯一键约束的字段值唯一,但是可以为null

  • 2、一张表可以设置多个唯一键约束,也可以设置联合唯一键,即多个字段设置一个唯一约束,但是不能使用"unique key"写在字段后设置,必须写在所有字段后,使用"unique key(字段,字段)"

  • 3、联合唯一键要求组成唯一约束的字段可以单独重复,不能同时重复

  • 4、 MySQL会给唯一约束的列上默认创建一个唯一索引。

  • 5、删除唯一键只能通过删除对应索引的方式删除,删除时需要指定唯一键索引名

5、非空约束:not null

create table t_user(
	id int primary key auto_increment,
    username varchar(20) unique key not null,
    password varchar(20)
);
#在建表后指定某个字段非空
ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL 【default 默认值】;
#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失
#取消某个字段非空
ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】;
#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失

非空约束的特点:

设置为非空约束的字段的值不能为null

6、默认值约束:default

create table t_user(
	id int primary key auto_increment,
    username varchar(20) unique key not null,
    password varchar(20),
    gender char not null default '男'
);

添加数据时使用默认值的方式:

不为该字段赋值或使用关键字default

  • insert into t_user(username,password) values(‘root’,‘123’);

  • insert into t_user values(null,‘admin123’,‘123’,default);

  • insert into t_user values(null,‘admin’,‘123’,null); //此方式不可以,会为该字段赋值为null

7、外键约束:foreign key

表关系:

1、一对一

2、多对一,在多的一方引用一的主键

  • student(sid,sname,age,sex,cid)–clazz(cid,cname,location)

3、一对多,在多的一方引用一的主键

  • clazz(cid,cname,location)–student(sid,sname,age,sex,cid)

4、多对多

  • user(uid,username,password)

  • order(oid,create_time,total_count,total_amount,status,user_id)

  • order_goods(id,oid,gid)

  • goods(gid,gname,price,sales,stock)

create table t_dept(
	id int primary key auto_increment,
    name varchar(20)
);
create table t_emp(
	id int primary key auto_increment,
    name varchar(20),
    age int,
    gender char,
    dept_id int,
    foreign key(dept_id) references t_dept(id) 
    #外键只能在所有字段列表后面单独指定
);
#在建表后指定外键约束
alter table 从表名称 add 【constraint 外键约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名) 【on update xx】[on delete xx];
#删除外键约束
ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;
#查看某个表的约束名
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
或
SHOW CREATE TABLE 表名;
#删除外键约束不会删除对应的索引,如果需要删除索引,需要用ALTER TABLE 表名称 DROP INDEX 索引名;
#查看索引名 show index from 表名称;

(1)外键特点

  • 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。

  • 在创建外键约束时,如果不给外键约束名称,默认名不是列名,而是自动产生一个外键名(例如 student_ibfk_1;),也可以指定外键约束名。

  • 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是列名,不是外键的约束名。

  • 删除外键时,关于外键列上的普通索引需要单独删除。

(2)要求

  • 在从表上建立外键,而且主表要先存在。

  • 一个表可以建立多个外键约束

  • 从表的外键列,在主表中引用的只能是键列(主键,唯一键,外键),推荐引用主表的主键。

  • 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样

(3)约束关系:约束是针对双方的

  • 添加了外键约束后,主表的修改和删除数据受约束

  • 添加了外键约束后,从表的添加和修改数据受约束

  • 在从表上建立外键,要求主表必须存在

  • 删除主表时,要求从表先删除,或将从表中外键引用该主表的关系先删除

(4)5个约束等级

  • Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录

  • Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null

  • No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

  • Restrict方式:同no action, 都是立即检查外键约束

  • Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别

如果没有指定等级,就相当于Restrict方式

8、检查约束:check

检查约束,mysql暂不支持

create table stu(
	sid int primary key,
	sname varchar(20),
	gender char check ('男'or'女')
);
insert into stu values(1,'张三','男');
insert into stu values(2,'李四','妖');
使用枚举类型解决如上问题:
create table stu(
	sid int primary key,
	sname varchar(20),
	gender enum ('男','女')
);

以上是MySQL約束與索引概念是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
MySQL與Sqlite有何不同?MySQL與Sqlite有何不同?Apr 24, 2025 am 12:12 AM

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是什麼?它們如何提高性能?MySQL中的索引是什麼?它們如何提高性能?Apr 24, 2025 am 12:09 AM

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

說明如何使用MySQL中的交易來確保數據一致性。說明如何使用MySQL中的交易來確保數據一致性。Apr 24, 2025 am 12:09 AM

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

在哪些情況下,您可以選擇PostgreSQL而不是MySQL?在哪些情況下,您可以選擇PostgreSQL而不是MySQL?Apr 24, 2025 am 12:07 AM

選擇PostgreSQL而非MySQL的場景包括:1)需要復雜查詢和高級SQL功能,2)要求嚴格的數據完整性和ACID遵從性,3)需要高級空間功能,4)處理大數據集時需要高性能。 PostgreSQL在這些方面表現出色,適合需要復雜數據處理和高數據完整性的項目。

如何保護MySQL數據庫?如何保護MySQL數據庫?Apr 24, 2025 am 12:04 AM

MySQL數據庫的安全可以通過以下措施實現:1.用戶權限管理:通過CREATEUSER和GRANT命令嚴格控制訪問權限。 2.加密傳輸:配置SSL/TLS確保數據傳輸安全。 3.數據庫備份和恢復:使用mysqldump或mysqlpump定期備份數據。 4.高級安全策略:使用防火牆限制訪問,並啟用審計日誌記錄操作。 5.性能優化與最佳實踐:通過索引和查詢優化以及定期維護兼顧安全和性能。

您可以使用哪些工具來監視MySQL性能?您可以使用哪些工具來監視MySQL性能?Apr 23, 2025 am 12:21 AM

如何有效監控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。 1.使用mysqladmin查看連接數。 2.用SHOWGLOBALSTATUS查看查詢數。 3.PMM提供詳細性能數據和圖形化界面。 4.MySQLEnterpriseMonitor提供豐富的監控功能和報警機制。

MySQL與SQL Server有何不同?MySQL與SQL Server有何不同?Apr 23, 2025 am 12:20 AM

MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显著差异,选择时需考虑项目规模和未来扩展性。

在哪些情況下,您可以選擇SQL Server而不是MySQL?在哪些情況下,您可以選擇SQL Server而不是MySQL?Apr 23, 2025 am 12:20 AM

在需要高可用性、高級安全性和良好集成性的企業級應用場景下,應選擇SQLServer而不是MySQL。 1)SQLServer提供企業級功能,如高可用性和高級安全性。 2)它與微軟生態系統如VisualStudio和PowerBI緊密集成。 3)SQLServer在性能優化方面表現出色,支持內存優化表和列存儲索引。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)