MySQL與PHP的基礎與應用專題之數據完整性

概述

從今天開始, 小白我將帶領大傢一起來補充一下 數據庫的知識.

數據完整性

數據完整性 (Data Integrity) 指存儲在數據庫 (Databse) 中的數據, 需要保證一致性和可靠性. 數據完整性可以防止數據庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作.

數據完整性包括:

  • 實體完整性: RDBMS 中一行代碼表示一個實體. 實體完整性就是保住每一個實體都能被區別
  • 域完整性: 對列的輸入的要求, 通過限制類的數據類型, 格式或值的范圍來實現
  • 參照完整性: 主要是表與表之間的關系, 可以通過外鍵來實現
  • 自定義完整性: 借助存儲過程和觸發器實現

實體完整性

實體完整性 (Enity Integrity) 要求每張表都有唯一標識符, 每張表中的主鍵字段不能為空且不能重復.

例如:

  • id
  • 編號

域完整性

域完整性 (Domain Integrity) 是針對某一具體關系數據庫約束條件. 域完整性能保證表中某些列不能輸入無效的值.

例如:

  • 數據類型
  • 格式
  • 值域范圍
  • 是否允許空值

舉個例子, 當我們錄入工資數據的時候, 工資的范圍應該確保負數不會被錄入.

參照完整性

參照完整性 (Referential Integrity) 指關聯的兩個表之間的約束. 參照完整性保證瞭表中每條記錄外鍵的值必須是表中存在的.

自定完整性

自定義完整性是針對某一具體關系數據庫的約束條件. 自定義完整性反映某一具體應用所涉及的數據必須滿足語義要求.

唯一性

在 MySQL 中, 可以使用關鍵字UNIQUE實現字段的唯一性約束, 從而保證實體的完整性.

UNIQUE 的特性:

  • 使用 UNIQUE, 則表中兩條數據的同一個字段不能有相同值
  • 一個表中可以有多個 UNIQUE 約束

PHP 代碼實現:

<?php

# 創建連接
$conn = mysqli_connect("localhost", "root", "admin", "study");

# 查看是否連接成功
if ($conn) {
    echo "服務器連接成功!";
} 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 '身份證號'
)";

# 執行SQL語句
$result = mysqli_query($conn, $SQL);

# 查看是否執行成功
if ($result) {
    echo "SQL語句執行成功!";
} else {
    echo mysqli_error($conn);
}

# 關閉連接
mysqli_close($conn);

?>

效果:

外鍵

外鍵 (Foreign KEY) 定義瞭表之間一致性, 用於強制參照完整性. 外鍵約束定義瞭對同一表或其他表的列的引用, 這些列具有 PRIMARY KEY 或 UNIQUE 約束.

創建主表 & 從表

<?php

# 創建連接
$conn = mysqli_connect("localhost", "root", "admin", "study");

# 查看是否連接成功
if ($conn) {
    echo "服務器連接成功!";
} else {
    echo mysqli_connect_error();
}

# SQL語句, 創建學生表
$SQL1 = "CREATE TABLE student (
    student_id INT(8) PRIMARY KEY COMMENT '學生id',
    student_name VARCHAR(255) NOT NULL COMMENT '學生姓名'
)";

# SQL語句, 創建成績表
$SQL2 = "CREATE TABLE grade (
    id INT(8) AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵id',
    student_id INT(8) NOT NULL COMMENT '學生id',
    course varchar(255) NOT NULL COMMENT '課程',
    grade INT(8) NOT NULL COMMENT '成績',
    FOREIGN KEY (student_id) references student(student_id)
)";

# 執行SQL語句
$result = mysqli_query($conn, $SQL1);

# 查看是否執行成功
if ($result) {
    echo "SQL語句執行成功!";
} else {
    echo mysqli_error($conn);
}

# 執行SQL語句
$result = mysqli_query($conn, $SQL2);

# 查看是否執行成功
if ($result) {
    echo "SQL語句執行成功!";
} else {
    echo mysqli_error($conn);
}

# 關閉連接
mysqli_close($conn);

?>

效果:

插入數據

<?php

# 創建連接
$conn = mysqli_connect("localhost", "root", "admin", "study");

# 查看是否連接成功
if ($conn) {
    echo "服務器連接成功!";
} else {
    echo mysqli_connect_error();
}

# SQL語句, 向主表添加數據
$SQL1 = "INSERT INTO student
    (student_id, student_name)
    VALUES(1, '我是小白呀'),
    (2, '我是大白呀')";

# 執行SQL語句
$result = mysqli_query($conn, $SQL1);

# SQL語句, 向從表添加數據
$SQL2 = "INSERT INTO grade
    (student_id, course, grade)
    VALUES(1, '語文', 59),
    (2, '語文', 99)";

# 執行SQL語句
$result = mysqli_query($conn, $SQL2);

# 查看是否執行成功
if ($result) {
    echo "SQL語句執行成功!";
} else {
    echo mysqli_error($conn);
}

# 關閉連接
mysqli_close($conn);

?>

錯誤展示

<?php

# 創建連接
$conn = mysqli_connect("localhost", "root", "admin", "study");

# 查看是否連接成功
if ($conn) {
    echo "服務器連接成功!";
} else {
    echo mysqli_connect_error();
}

# SQL語句, 錯誤展示 (主表沒有student_id=3)
$SQL = "INSERT INTO grade
    (student_id, course, grade)
    VALUES(3, '語文', 88)";

# 執行SQL語句
$result = mysqli_query($conn, $SQL);

# 查看是否執行成功
if ($result) {
    echo "SQL語句執行成功!";
} else {
    echo mysqli_error($conn);
}

# 關閉連接
mysqli_close($conn);

?>

報錯:

服務器連接成功!
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\數據庫\外鍵錯誤.php:19
Stack trace:
#0 C:\Users\Windows\Desktop\數據庫\外鍵錯誤.php(19): mysqli_query(Object(mysqli), 'INSERT INTO gra…')
#1 {main}
thrown in C:\Users\Windows\Desktop\數據庫\外鍵錯誤.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\數據庫\外鍵錯誤.php:19
Stack trace:
#0 C:\Users\Windows\Desktop\數據庫\外鍵錯誤.php(19): mysqli_query(Object(mysqli), 'INSERT INTO gra…')
#1 {main}
thrown in C:\Users\Windows\Desktop\數據庫\外鍵錯誤.php on line 19

到此這篇關於MySQL與PHP的基礎與應用專題之數據完整性的文章就介紹到這瞭,更多相關MySQL 數據完整性內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: