數據完整性
如何添加數據完整性
- 在創建表的時候給表添加約束
完整性分類
- 實體完整性
- 域完整性
- 引用完整性
實體完整性
- 什么是實體完整性
- 表中的一行(一條記錄)代表一個實體(entity)
- 實體完整性的作用
- 標識(標記)每一行數據不重復.行級約束
3. 約束類型 - 主鍵約束(primary key)
- 唯一約束(unique)
- 自動增長(auto_increment)
3.1 主鍵約束
特點:
- (創建)每個表中要有一個主鍵
- 數據唯一,且不能為null
添加方式:
- 方式1:
CREATE TABLE 表名(字段名1 數據類型 primary key,字段名2 數據類型);
舉例:
創建person表
CREATE TABLE person(ID BIGINT primary key,NAME VARCHAR(50))
- 方式2:
CREATE TABLE 表名(字段1 數據類型,字段名2 數據類型,primary key(要設置主鍵的字段));
舉例:
CREATE TABLE person(
ID BIGINT,
name VARCHAR(50),
age INT,
primary key(ID)
);
聯合主鍵:兩個字段數據同時相同時,才違反聯合主鍵約束
CREATE TABLE 表名(字段1 數據類型,字段2 數據類型,primary key(主鍵1,主鍵2));
CREATE TABLE student(
ID BIGINT,
snum BIGINT,
name VARCHAR(50),
primary key(ID,snum))
先創建表再添加主鍵
CREATE TABLE student(sid INT,name VARCHAR(50));
**如果表中你之前已經添加了數據,數據不符合主鍵規則就會報錯
ALTER TABLE student ADD CONSTRAINT primary key(sid);
唯一約束
特點
- 指定列的數據不能重復
- 可以為空值
格式:
CREATE TABLE students(
id INT primary key,
name VARCHAR(50) UNIQUE
)
自動增長列
特點
- 指定列的數據自動增長
- 即使數據刪除,還是從刪除的序號繼續往下
- 一般我們會給主鍵設置為自動增長列
格式:
CREATE TABLE 表名(
字段名1 數據類型 primary key AUTO_INCREMENT,
字段2 數據類型 UNIQUE);
舉例:
CREATE TABLE students(
id INT primary key AUTO_INCREMENT,
name VARCHAR(20) UNIQUE)
);
域完整性
- 域完整性
數據類型
- 數值類型
- 日期類型
- 字符串類型
非空約束(NOT NULL)
CREATE TABLE stu(
id int primary key auto_increment,
name varchar(20) unique not null,
gender char(1) default '男'
);
默認值約束
(DEFAULT)CREATE TABLE 表名(字段名1 數據類型 primary key AUTO_INCREMENT,字段2 數據類型 UNIQUE NOT NULL,字段3 數據類型 DEFAULT '默認值');
舉例:
CREATE TABLE students(
id INT primary key AUTO_INCREMENT,
name VARCHAR(20) UNIQUE NOT NULL,
gender CHAR(1) DEFAULT '男'
);
參照完整性介紹
- 什么是參照完整性
- 是指表與表之間的一種對應關系
- 通常情況下可以通過設置兩表之間的主鍵、外鍵關系,或者編寫兩表的觸發器來實現
- 有對應參照完整性的兩張表格,再對他們進行數據插入,更新,刪除的過程中,系統都會將被修改表格與另外一張對應表格進行對照,從而阻止一些不正確的數據的操作
- 數據庫的主鍵和外鍵類型一定要一致
- 兩個表必須要是InnoDB引擎
- 設置參照完整性后,外鍵當中的內值,必須得是主鍵當中的內容
- 一個表設置當中的字段設置為主鍵,設置主鍵的為主表
- 創建表時,設置外鍵,設置外鍵的為子表
參照完整性添加
1. 通過一張表里面的某個字段,關聯另外一張表
1. 對已有表添加外鍵關系
ALTER TABLE score ADD CONSTRAINT sc_st_fk FOREIGN KEY(sid) REFERENCES student(id);
表之間關系[一對一,一對多,多對多]
1. 一對一
- 一夫一妻(開發中使用比較少)
2. 一對多關系
- 一個人可以擁有多輛汽車,要求查詢某個人擁有的所有車輛
- 創建Person表
CREATE TABLE person(
p_id INT PRIMARY KEY AUTO_INCREMENT,
p_name VARCHAR(50),
p_age INT,
p_sex CHAR(1)
);
- 創建Car表
CREATE TABLE car(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(50),
c_color VARCHAR(25),
p_id INT,
CONSTRAINT fk_Person FOREIGE KEY(c_id) REFERENCES person(p_id)
);
3. 多對多關系
- 例如:學生選課,一個學生可以選修多門課程,每門課程可以供多個學生選擇
- 再例如: 老師和學生的多對多關系(一個老師有多個學生,一個學生有多個老師)
- 創建老師表
CREATE TABLE teacher(
t_id INT PRIMARY KEY AUTO_INCREMENT,
t_name VARCHAR(50),
t_age INT,
t_genger CHAR(1) DEFAULT '男'
);
- 創建學生表
CREATE TABLE students(
s_id INT PRIMARY KEY AUTO_INCREMENT,
s_name VARCHAR(50) NOT NULL,
s_age INT,
s_gender CHAR(1) DEFAULT '男'
);
- 中間表(創建學生與老師 關系表)
CREATE TABLE tea_stu_rel(
t_id INT,
s_id INT
);
- 添加外鍵
ALTER TABLE tea_stu_rel
ADD CONSTRAINT fk_tid
FOREIGN KEY(t_id)
REFERENCES teacher(t_id);
ALTER TABLE tea_stu_rel
ADD CONSTRAINT fk_sid
FOREIGN KEY(sid)
REFERENCES students(sid);
合并結果集UNION與UNION_ALL
1. 什么是合并結果集
- 合并結果集就是把兩個SELECT語句的查詢結果合并到一起展示
2. 合并結果集的兩種方式
1.UNION
- 合并時去除重復記錄
2.UNION ALL
- 合并時不去除重復記錄
3. 格式
SELECT * FROM 表1 UNION SELECT * FROM 表2;
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;
4. 示例
- 創建表
CREATE TABLE A(name VARCHAR(10),score INT);
CREATE TABLE B(name VARCHAR(10),score INT);
--
INSERT INTO A VALUES('a',10),('b',20),('c',30);
INSERT INTO A VALUES('a',10),('b',20),('c',40);
UNION
SELECT * FROM AUNIONSELECT * FROM B;
UNION ALL
SELECT * FROM AUNION ALLSELECT * FROM B;
注意事項
- 被合并的兩個結果集:列數,列類型必須相同
作者:天王的
鏈接:http://www.lxweimin.com/p/3518e1586d35
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。