為了維護數據表的數據完整性而設定的一系列規則,防止用戶在數據表中插入一些錯誤的數據. 1. 表約束分類 主鍵約束:保證數據的完整性,唯一性,原子性(Id:編號) 外鍵約束 分類表數據: Id分類名稱 1 衣服 2 手機 3 電器 商品表數據: 商品編號商品名稱價格所屬分類(外鍵) 1 李寧牌運動服 ...
1. 表約束分類
-
主鍵約束:保證數據的完整性,唯一性,原子性(Id:編號)
-
外鍵約束
分類表數據:
Id 分類名稱 1 衣服 2 手機 3 電器 商品表數據:
商品編號 商品名稱 價格 所屬分類(外鍵) 1 李寧牌運動服 300 1 2 華為7500手機 3600 2 3 國美電飯堡 200 3 4 國美油煙機 2500 5(不合理) -
唯一約束
-
檢查約束
-
預設值約束
-
非空約束
2. 主鍵約束
主鍵只能有一個,但是可以由1-n個欄位組成,多個欄位組成的主鍵叫複合主鍵
-- 在表中添加主鍵約束 create database 第四單元; -- 簡寫的創建資料庫的語法,資料庫的相關參數都是預設值 -- 切換資料庫 use 第四單元; -- 第一種寫法 create table Category ( -- 列級約束 Id int primary key identity, -- 商品分類編號, primary key 是主鍵約束 CategoryName varchar(20) ) -- 第二種寫法 create table Category2 ( Id int identity, CategoryName varchar(20), --primary key(Id) -- 表級約束 constraint pk_category2_id primary key(id) ) -- 第三種寫法,假設表已經創建完畢,突然發現,主鍵忘記創建了 create table Category3 ( Id int identity, -- 商品分類編號, primary key 是主鍵約束 CategoryName varchar(20) ) -- 表級約束 alter table Category3 add constraint pk_category3_id primary key(Id)
表級約束,列級約束
列約束是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之後,用空格分隔,不必指定列名; 表約束與列定義相互獨立,不包括在列定義中,通常用於對多個列一起進行約束,與列定義用’,’分隔,定義表約束時必須指出要約束的那些列的名稱。
區別
如果完整性約束涉及到該表的多個屬性列,必須定義在表級上,否則既可以定義在列級也可以定義在表級。
簡而言之: 列級約束:列級約束是行定義的一部分,只能應用於一列上。 表級約束:表級約束是獨立於列的定義,可以應用在一個表中的多列上。
3. 複合主鍵
create table score ( studentId int, courseId int, score int, addTime datetime, primary key(studentId,courseId) -- 複合主鍵 )
學生編號 | 課程編號 | 成績 | 添加時間 |
---|---|---|---|
1 | 1 | 80 | 2022-04-02 |
1 | 2 | 78 | 2022-04-02 |
2 | 1 | 92 | 2022-04-02 |
2. 外鍵約束
-- 商品表 create table Product ( Id int primary key identity, -- 商品編號 ProductName varchar(20), Price decimal(8,2), -- 8,2 指的是,加上小數最多可以有8位,和2位小數 -- 商品分類,這裡的int 必須與Category商品表中的Id的類型保持一致 -- foreign key :外鍵 -- references:參照,引用,指向 CategoryId int foreign key references Category3(Id) )
-- 表級 外鍵 create table Product2 ( Id int primary key identity, -- 商品編號 ProductName varchar(20), Price decimal(8,2), -- 8,2 指的是,加上小數最多可以有8位,和2位小數 -- 商品分類,這裡的int 必須與Category商品表中的Id的類型保持一致 -- foreign key :外鍵 -- references:參照,引用,指向 CategoryId int, constraint fk_CategoryId foreign key(CategoryId) references Category3(Id) );
-- 第三種:在創建表的時候,添加了外鍵,但是沒有加外鍵約束
create table Product3 ( Id int primary key identity, -- 商品編號 ProductName varchar(20), Price decimal(8,2), -- 8,2 指的是,加上小數最多可以有8位,和2位小數 -- 商品分類,這裡的int 必須與Category商品表中的Id的類型保持一致 -- foreign key :外鍵 -- references:參照,引用,指向 CategoryId int ); alter table Product3 add constraint fk_CategoryId foreign key(CategoryId) references Category3(Id)
3. 唯一約束
-- 表級唯一約束 create Table UserInfo2 ( Id int primary key identity, NickName varchar(20) , -- 用戶姓名 Email varchar(20), constraint uq_NickName unique(NickName) -- NickName 添加了一個唯一約束 ); -- 也可以這樣 create Table UserInfo2 ( Id int primary key identity, NickName varchar(20) unique(NickName), Email varchar(20) );
Id | 用戶名 | 郵箱 |
---|---|---|
1 | zhangsan | [email protected] |
2 | lisi | [email protected] |
3 | lisi(失敗) | [email protected] |
4. 檢查約束
Check約束通過邏輯表達式來判斷數據的有效性,用來限制輸入一列或多列的值的範圍
Create Table UserInfo4 ( Id int primary key identity, NickName varchar(20), Email varchar(20), Sex varchar(10) check(Sex in('男','女')), --性別:檢查性別隻能輸入 ,男或者女 Age tinyint check(Age>=18), -- 年齡:檢查年齡是否大於等於18 -- len(Pwd):獲取密碼的實際長度 Pwd varchar(50) check(len(Pwd)>=4 and len(Pwd)<=16), -- 密碼:密碼的實際長度必須是4-16位 )
請判斷如下哪些數據是非法的(可以在評論區或者彈幕中告訴我答案)?
id | 姓名 | 郵箱 | 性別 | 年齡 | 密碼 |
---|---|---|---|---|---|
1 | 張三 | [email protected] | 男 | 18 | root |
2 | 李四 | [email protected] | 保密 | 20 | 123456 |
3 | 葉星辰 | [email protected] | 女 | 19 | 123 |
4 | 趙日天 | [email protected] | 男 | 17 | 12345678 |
5. 預設值約束
create Table UserInfo6 ( Id int primary key identity, NickName varchar(20) default '張三', -- 預設值為張三 Email varchar(20), -- 可以為null Age tinyint default '10' -- 添加預設值約束 )
6. 非空約束
Create Table UserInfo5 ( Id int primary key identity, NickName varchar(20) not null, -- 非空約束 Email varchar(20), -- 可以為null )
7. 作業
一. 創建資料庫DBStudents
二. 創建表student表
(stu_id 主鍵 不為空
stu_name 不為空
stu_tel;
stu_sex 檢查約束男,女,預設男;
stu_address 預設 北京;
stu_age 介於16-40歲之間
三. 案例完成思路及要求:
-
使用sql命令語句創建資料庫(10分)
-
使用sql命令語句創建數據表和創建正確約束(50分)
-
使用sql命令語句修改表結構刪除表中stu_age列(10分)
-
使用sql命令語句刪除表(10分)
-
使用sql命令語句刪除資料庫(10分)
-
註釋 (10分)
配套視頻鏈接:【階段二】 - SQLServer 基礎(超級詳細,口碑爆盆)_嗶哩嗶哩_bilibili
海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。