MySQL與PHP的基礎(chǔ)與應(yīng)用專題之?dāng)?shù)據(jù)完整性
概述
從今天開始, 小白我將帶領(lǐng)大家一起來補(bǔ)充一下 數(shù)據(jù)庫的知識(shí).
數(shù)據(jù)完整性
數(shù)據(jù)完整性 (Data Integrity) 指存儲(chǔ)在數(shù)據(jù)庫 (Databse) 中的數(shù)據(jù), 需要保證一致性和可靠性. 數(shù)據(jù)完整性可以防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入輸出造成無效操作.
數(shù)據(jù)完整性包括:
- 實(shí)體完整性: RDBMS 中一行代碼表示一個(gè)實(shí)體. 實(shí)體完整性就是保住每一個(gè)實(shí)體都能被區(qū)別
- 域完整性: 對列的輸入的要求, 通過限制類的數(shù)據(jù)類型, 格式或值的范圍來實(shí)現(xiàn)
- 參照完整性: 主要是表與表之間的關(guān)系, 可以通過外鍵來實(shí)現(xiàn)
- 自定義完整性: 借助存儲(chǔ)過程和觸發(fā)器實(shí)現(xiàn)
實(shí)體完整性
實(shí)體完整性 (Enity Integrity) 要求每張表都有唯一標(biāo)識(shí)符, 每張表中的主鍵字段不能為空且不能重復(fù).
例如:
- id
- 編號
域完整性
域完整性 (Domain Integrity) 是針對某一具體關(guān)系數(shù)據(jù)庫約束條件. 域完整性能保證表中某些列不能輸入無效的值.
例如:
- 數(shù)據(jù)類型
- 格式
- 值域范圍
- 是否允許空值
舉個(gè)例子, 當(dāng)我們錄入工資數(shù)據(jù)的時(shí)候, 工資的范圍應(yīng)該確保負(fù)數(shù)不會(huì)被錄入.
參照完整性
參照完整性 (Referential Integrity) 指關(guān)聯(lián)的兩個(gè)表之間的約束. 參照完整性保證了表中每條記錄外鍵的值必須是表中存在的.
自定完整性
自定義完整性是針對某一具體關(guān)系數(shù)據(jù)庫的約束條件. 自定義完整性反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足語義要求.
唯一性
在 MySQL 中, 可以使用關(guān)鍵字UNIQUE
實(shí)現(xiàn)字段的唯一性約束, 從而保證實(shí)體的完整性.
UNIQUE 的特性:
- 使用 UNIQUE, 則表中兩條數(shù)據(jù)的同一個(gè)字段不能有相同值
- 一個(gè)表中可以有多個(gè) UNIQUE 約束
PHP 代碼實(shí)現(xiàn):
<?php # 創(chuàng)建連接 $conn = mysqli_connect("localhost", "root", "admin", "study"); # 查看是否連接成功 if ($conn) { echo "服務(wù)器連接成功!"; } else { echo mysqli_connect_error(); } # SQL語句 (身份證帶唯一性) $SQL = "CREATE TABLE user_with_id ( id INT(8) AUTO_INCREMENT PRIMARY KEY comment '主鍵id', username VARCHAR(255) NOT NULL comment '姓名', id_number varchar(255) UNIQUE NOT NULL comment '身份證號' )"; # 執(zhí)行SQL語句 $result = mysqli_query($conn, $SQL); # 查看是否執(zhí)行成功 if ($result) { echo "SQL語句執(zhí)行成功!"; } else { echo mysqli_error($conn); } # 關(guān)閉連接 mysqli_close($conn); ?>
效果:
外鍵
外鍵 (Foreign KEY) 定義了表之間一致性, 用于強(qiáng)制參照完整性. 外鍵約束定義了對同一表或其他表的列的引用, 這些列具有 PRIMARY KEY 或 UNIQUE 約束.
創(chuàng)建主表 & 從表
<?php # 創(chuàng)建連接 $conn = mysqli_connect("localhost", "root", "admin", "study"); # 查看是否連接成功 if ($conn) { echo "服務(wù)器連接成功!"; } else { echo mysqli_connect_error(); } # SQL語句, 創(chuàng)建學(xué)生表 $SQL1 = "CREATE TABLE student ( student_id INT(8) PRIMARY KEY COMMENT '學(xué)生id', student_name VARCHAR(255) NOT NULL COMMENT '學(xué)生姓名' )"; # SQL語句, 創(chuàng)建成績表 $SQL2 = "CREATE TABLE grade ( id INT(8) AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵id', student_id INT(8) NOT NULL COMMENT '學(xué)生id', course varchar(255) NOT NULL COMMENT '課程', grade INT(8) NOT NULL COMMENT '成績', FOREIGN KEY (student_id) references student(student_id) )"; # 執(zhí)行SQL語句 $result = mysqli_query($conn, $SQL1); # 查看是否執(zhí)行成功 if ($result) { echo "SQL語句執(zhí)行成功!"; } else { echo mysqli_error($conn); } # 執(zhí)行SQL語句 $result = mysqli_query($conn, $SQL2); # 查看是否執(zhí)行成功 if ($result) { echo "SQL語句執(zhí)行成功!"; } else { echo mysqli_error($conn); } # 關(guān)閉連接 mysqli_close($conn); ?>
效果:
插入數(shù)據(jù)
<?php # 創(chuàng)建連接 $conn = mysqli_connect("localhost", "root", "admin", "study"); # 查看是否連接成功 if ($conn) { echo "服務(wù)器連接成功!"; } else { echo mysqli_connect_error(); } # SQL語句, 向主表添加數(shù)據(jù) $SQL1 = "INSERT INTO student (student_id, student_name) VALUES(1, '我是小白呀'), (2, '我是大白呀')"; # 執(zhí)行SQL語句 $result = mysqli_query($conn, $SQL1); # SQL語句, 向從表添加數(shù)據(jù) $SQL2 = "INSERT INTO grade (student_id, course, grade) VALUES(1, '語文', 59), (2, '語文', 99)"; # 執(zhí)行SQL語句 $result = mysqli_query($conn, $SQL2); # 查看是否執(zhí)行成功 if ($result) { echo "SQL語句執(zhí)行成功!"; } else { echo mysqli_error($conn); } # 關(guān)閉連接 mysqli_close($conn); ?>
錯(cuò)誤展示
<?php # 創(chuàng)建連接 $conn = mysqli_connect("localhost", "root", "admin", "study"); # 查看是否連接成功 if ($conn) { echo "服務(wù)器連接成功!"; } else { echo mysqli_connect_error(); } # SQL語句, 錯(cuò)誤展示 (主表沒有student_id=3) $SQL = "INSERT INTO grade (student_id, course, grade) VALUES(3, '語文', 88)"; # 執(zhí)行SQL語句 $result = mysqli_query($conn, $SQL); # 查看是否執(zhí)行成功 if ($result) { echo "SQL語句執(zhí)行成功!"; } else { echo mysqli_error($conn); } # 關(guān)閉連接 mysqli_close($conn); ?>
報(bào)錯(cuò):
服務(wù)器連接成功!
Fatal error: Uncaught mysqli_sql_exception: Cannot add or update a child row: a foreign key constraint fails (`study`.`grade`, CONSTRAINT `grade_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`)) in C:\Users\Windows\Desktop\數(shù)據(jù)庫\外鍵錯(cuò)誤.php:19
Stack trace:
#0 C:\Users\Windows\Desktop\數(shù)據(jù)庫\外鍵錯(cuò)誤.php(19): mysqli_query(Object(mysqli), 'INSERT INTO gra...')
#1 {main}
thrown in C:\Users\Windows\Desktop\數(shù)據(jù)庫\外鍵錯(cuò)誤.php on line 19
PHP Fatal error: Uncaught mysqli_sql_exception: Cannot add or update a child row: a foreign key constraint fails (`study`.`grade`, CONSTRAINT `grade_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`)) in C:\Users\Windows\Desktop\數(shù)據(jù)庫\外鍵錯(cuò)誤.php:19
Stack trace:
#0 C:\Users\Windows\Desktop\數(shù)據(jù)庫\外鍵錯(cuò)誤.php(19): mysqli_query(Object(mysqli), 'INSERT INTO gra...')
#1 {main}
thrown in C:\Users\Windows\Desktop\數(shù)據(jù)庫\外鍵錯(cuò)誤.php on line 19
到此這篇關(guān)于MySQL與PHP的基礎(chǔ)與應(yīng)用專題之?dāng)?shù)據(jù)完整性的文章就介紹到這了,更多相關(guān)MySQL 數(shù)據(jù)完整性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL與PHP的基礎(chǔ)與應(yīng)用專題之表連接
- MySQL與PHP的基礎(chǔ)與應(yīng)用專題之?dāng)?shù)據(jù)查詢語句
- MySQL與PHP的基礎(chǔ)與應(yīng)用專題之內(nèi)置函數(shù)
- MySQL與PHP的基礎(chǔ)與應(yīng)用專題之?dāng)?shù)據(jù)查詢
- MySQL與PHP的基礎(chǔ)與應(yīng)用專題之增刪改查
- MySQL與PHP的基礎(chǔ)與應(yīng)用專題之創(chuàng)建數(shù)據(jù)庫表
- MySQL與PHP的基礎(chǔ)與應(yīng)用專題之?dāng)?shù)據(jù)控制
相關(guān)文章
mysql使用xtrbackup+relaylog增量恢復(fù)注意事項(xiàng)
這篇文章主要介紹了mysql使用xtrbackup+relaylog增量恢復(fù),本次實(shí)驗(yàn)mysql5.7.19.使用了GTID,row格式的binlog,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05MySQL索引優(yōu)化之適合構(gòu)建索引的幾種情況詳解
我們知道正確的建立索引可以加快數(shù)據(jù)庫的查詢,但是如果索引建立不當(dāng),或者隨意的建立過多索引不僅不會(huì)提升數(shù)據(jù)庫的效率,反而在進(jìn)行數(shù)據(jù)更新操作的時(shí)候需要耗費(fèi)系統(tǒng)資源對索引進(jìn)行維護(hù),同時(shí)占用大量的存儲(chǔ)空間來對索引進(jìn)行存儲(chǔ),本文主要講述在哪些情況下適合建立索引2022-07-07MySQL使用mysqldump實(shí)現(xiàn)數(shù)據(jù)完全備份
mysqldump是MySQL自帶的備份工具,可方便實(shí)現(xiàn)對MySQL的備份,也可以將指定的庫、表導(dǎo)出為SQL腳本,下面小編就來教大家如何使用mysqldump實(shí)現(xiàn)數(shù)據(jù)完全備份吧2023-07-07Navicat數(shù)據(jù)存放位置和備份數(shù)據(jù)庫路徑設(shè)置方式
這篇文章主要介紹了Navicat數(shù)據(jù)存放位置和備份數(shù)據(jù)庫路徑設(shè)置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01淺析SQL語句行列轉(zhuǎn)換的兩種方法 case...when與pivot函數(shù)的應(yīng)用
SQL語句行列轉(zhuǎn)換的兩種方法 case...when和pivot函數(shù)應(yīng)用,運(yùn)用pivot 函數(shù)只支持?jǐn)?shù)據(jù)庫版本2005以上的。一般運(yùn)用case when else end 的方法比較多,比較普遍2013-08-08mysql 5.7.11 winx64.zip安裝配置方法圖文教程
這篇文章主要為大家分享了mysql5.7.11安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2017-02-02MySQL ERROR 1045 (28000) 錯(cuò)誤的解決辦法
這篇文章主要介紹了MySQL ERROR 1045 (28000) 錯(cuò)誤的解決辦法,很實(shí)用的解決方法,感興趣的小伙伴們可以參考一下2016-06-06