文章目錄
- 數據的完整性
- 實體的完整性
- 主鍵
- 域完整性
- 參照完整性
- 外鍵
- 多表設計/多表理論
- 一對一和一對多
- 多對多
- 數據庫的設計范式
- 第一范式:原子性
- 第二范式:唯一性
- 第三范式:不冗余性
數據的完整性
實體的完整性
加主鍵,保證一個表中每一條數據 和其他條目不同。
主鍵
實體完整性確保表中的每一行都是唯一的,并且具有唯一的標識符(通常是一個主鍵)。這意味著在表中不能有重復的行,并且主鍵字段不能包含NULL值。
主鍵
在SQL中,主鍵(Primary Key)是一個或多個字段的組合,用于唯一標識數據庫表中的每一行記錄。其具備以下特點:
- 唯一: 主鍵的值必須是唯一的,不允許有重復的值。
- 非空:主鍵字段不能包含
NULL
值- 主鍵可以加快查詢速度:主鍵在創建時會自動建立索引,這有助于提高查詢速度。
在一個標準,存儲數據的時候,邏輯上我們認為一行數據是一個不可拆分的整體,要求(不是語法要求,是約定俗成的數據庫使用規范)每一行數據和另一行不要重復,所以我們在上面的創建表的時候,就給了一個id,準備用它來充當“唯一標識”、
主鍵的定義:SQL語法 primary key
我們可以給表中的某一列設置為主鍵,
成為主鍵之后有兩個特點:(1)不允許為null,(2)不允許在表中重復
CREATE TABLE `test`(`id` int primary key,`name` varchar(255),`gender` char(1)
);-- 或者CREATE TABLE `test`(`id` int,`name` varchar(255),`gender` char(1),primary key(id)
);-- 如果一個表表在創建的時候沒有主鍵,增加主鍵的sql -- 使用上:沒有任何意義,
-- alter table 表名 add primary key(主鍵列);
alter table user add primary key (id);-- 聯合主鍵:復合主鍵(不建議)。這意味著id和name的組合在table_primary3表中表示主鍵。
CREATE TABLE table_primary3(id INT(11),name VERCHAR(25),job VERCHAR(25),salary FLOAT,PRIMARY KEY(id, name)
);
insert into test values(1, 'zl', '男'); -- 如果有id 1,就會插入報錯。
如果要解決正確的步驟就是先查表,看哪個id沒有使用,然后插入的時候再插入
-- 使用sql語句解決-- 在創建表時
CREATE TABLE `test`(`id` int primary key AUTO_INCREMENT,`name` varchar(255),`gender` char(1)
);-- 插入
-- 服務器接收sql語句,插入NULL對應id,發現id為主鍵,然后看是否自增,如果不是自增就會報錯,有自增會選取一個自增值
insert into test values(null, 'zl', '男');
域完整性
設計某些列,類型要合適,范圍要合適
儲存數據的時候,存儲的內容要符合列的類型的設置
參照完整性
在關系型數據庫中,一個表的數據可能依賴于另一個表的數據而存在,或者說兩個表的數據存在關聯,所以我們希望這種關聯/參照,具有一致性(要修改的是同步進行變化)。
外鍵只是保證參照完整性的一種方式
外鍵
強制綁定兩個具有參照的表的字段。
也就是將一個表的外鍵綁定為另一個表的主鍵
在對一個表中的鍵進行修改時,可能會另一個關聯表中進行全局掃描,因為要查看在另一個表中是否在使用。并且主鍵的掃描次數會少,性能高一點,但是外鍵的查找性能會低很多。
(修改主鍵值時,數據庫需要檢查所有關聯的外鍵約束。如果外鍵列沒有索引,會導致全表掃描,性能較差;而主鍵由于自帶唯一索引,查找效率較高。因此,在設計數據庫時,應避免頻繁修改主鍵,并為外鍵創建索引以提高查詢性能)
外鍵是 MySQL 中用于建立和加強兩個表數據之間鏈接的一種約束。下面我來介紹它的使用方法:
創建外鍵
在創建表時,可以通過以下方式定義外鍵:
CREATE TABLE 表名(字段1 數據類型,字段2 數據類型,...[CONSTRAINT 外鍵約束名] FOREIGN KEY (外鍵字段名) REFERENCES 主表名(主鍵字段名)
);
舉個例子:
CREATE TABLE department (id INT PRIMARY KEY,name VARCHAR(50)
);CREATE TABLE employee (id INT PRIMARY KEY,name VARCHAR(50),department_id INT,FOREIGN KEY (department_id) REFERENCES department(id)
);
刪除外鍵
可以使用 ALTER TABLE 語句來刪除外鍵約束:
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵約束名;
要留意的是,外鍵約束名可以通過查看表結構獲取,也能在創建外鍵時自行定義。
外鍵約束選項
在外鍵定義中,還能夠添加 ON UPDATE 和 ON DELETE 子句,以此來定義當主表中的記錄被更新或者刪除時,從表應該執行的操作。常見的選項如下:
- ON DELETE CASCADE:主表記錄刪除時,從表相關記錄自動刪除。
- ON UPDATE CASCADE:主表記錄更新時,從表相關記錄自動更新。
- ON DELETE SET NULL:主表記錄刪除時,從表相關字段設為 NULL(要求該字段允許 NULL 值)。
- ON UPDATE SET NULL:主表記錄更新時,從表相關字段設為 NULL。
示例如下:
CREATE TABLE employee (id INT PRIMARY KEY,name VARCHAR(50),department_id INT,FOREIGN KEY (department_id) REFERENCES department(id)ON DELETE CASCADEON UPDATE CASCADE
);
使用外鍵的注意事項
- 主表和從表的字段數據類型要保持一致。
- 主表的字段必須是主鍵或者具有唯一約束。
- InnoDB 存儲引擎才支持外鍵,MyISAM 不支持。
- 外鍵會對數據的插入、更新和刪除操作產生影響,可能會導致性能下降。
- 要避免出現循環外鍵約束,不然會造成死鎖的情況。
多表設計/多表理論
一對一和一對多
一對一的表很少見,因為在理論上可以合并為一張表。
多對多
多對多的兩張表一般需要一個中間對照表來連接兩個表之間的關系。
依靠中間表,來將多對多的兩張表,進行連接,對應下面就是:學生信息與對照表是一對多的關系,劇本表與對照表是一對多的關系,學生信息表與劇本表是多對多的關系。
數據庫的設計范式
第一范式:原子性
第二范式:唯一性
不存在部分依賴(不能是組合唯一,就是使用聯合主鍵)必須為某一列作為主鍵設置唯一。