繼續上一篇內容 SQL Server 資料庫基本記錄(二)
資料表
資料的完整性:資料的準確性和可靠性,不準確、不一致的資料,則導致資料 失去了完整性
實體完整性
- 要求表中的所有的行唯一
UserId | UserPwd | UserName | Gender |
---|---|---|---|
bobo | 123456 | 王波 | 0 |
不能新增以下行,加粗部分表示重複
bobo | 123456 | 王波 | 0 |
- 約束方法:唯一約束、主鍵約束、標識列
域完整性約束
- 保證列值符合規定要求
UserId | UserPwd | UserName | Gender |
---|---|---|---|
bobo | 123456 | 王波 | 0 |
不能新增以下行,加粗部分表示密碼長度小於六位
yuyu | 1236 | 王雨 | 1 |
- 約束方法:限制資料型別、檢查約束、外來鍵約束、預設值、非空約束
引用完整性約束
- 要求兩表相同欄位必須一致
SortId | SortName |
---|---|
1 | 手機數碼 |
2 | 圖書音像 |
3 | 家用電器 |
下表相同欄位必須一致,不能填寫主鍵中未存在的內容
SortId | CommodityName |
---|---|
1 | IPhone 8 |
1 | OnePlus 5 |
3 | 三門冰箱 |
下表不可新增,因為 SortId 不存在 4
SortId | CommodityName |
---|---|
4 | 電商時代 |
- 約束方法:外來鍵約束
主外來鍵
主鍵
- 表中一列或幾列組合的,能夠唯一標識表中的每一行
- 一個表只能有一個主鍵
- 多列組合當主鍵稱為複合主鍵
原則:最少性和唯一性
外來鍵
- 相對應於主鍵
- 一個表可以有多個外來鍵
標識列
- 自動增長列 或 自動編號
- 本身沒有具體的含義,只是用來標識不同的實體
標識列的實現方式
- 標識列用來區分不同的實體
- 定義成標識列時,需要指定 標識種子 和 標識增量,預設值都為 1
- 標識列通常也被定義為 主鍵
- 定義為標識列的列必須是 整型
- 標識列資料是 自動增加 的,不能手動的為標識列插入值
空值:NULL 在填入資料值時可不填 預設值:表中的某列,使用者不輸入資料的時候,將被自動填入
資料型別
分類 | 資料型別 | 說明 |
---|---|---|
文字資料型別 字元資料包括任意字母、符號或數字字元的組合 |
char varchar nchar nvarchar text ntext |
固定長度的非 Unicode 字元資料 可變長度非 Unicode 資料 固定長度的 Unicode 資料 可變長度的 Unicode 資料 儲存長文字資訊 儲存可變長度的長文字 |
日期和時間 | datetime | |
數字資料型別 僅包含數字,包括整數和浮點數 |
int、smallint、float、real、numcric(18,0) | 整數、浮點數 |
貨幣型別資料 十進位制貨幣值 |
money | |
bit 資料型別 表示 是/否 的資料 |
bit | 儲存布林資料型別 |
建立表
USE E_Market -- 指向當前所操作的資料庫
GO -- 批處理標識
CREATE TABLE CommoditySort -- 建立名為 CommoditySort 的表
(
SortId int IDENTITY(1,1) NOT NULL, -- SortId 列,不允許空值
SortName varchar(50) NOT NULL -- SortName 列,長度 50,不允許空值
)
複製程式碼
約束
約束型別
- 主鍵約束:要求主鍵列不能為空以及唯一
- 非空約束:要求該列不能存在空值
- 唯一約束:要求該列的值必須唯一,允許為空,但只能出現一個空值
- 檢查約束:限制某列取值的範圍是否合適
- 預設約束:設計某列的預設值
- 外來鍵約束:用於在兩表之間建立關係,需要指定引用主鍵的時哪一列
- 主鍵約束與唯一約束的區別 -- 主鍵約束所在的列不允許有空值,唯一約束所列允許空值 -- 每個表中可以有一個主鍵,多個唯一鍵
語法
ALTER TABLE 表名
ADD CONSTRAINT 約束名 約束型別_約束列
E.g:
USE E_Market
GO
-- 為使用者表UserInfo新增約束
ALTER TABLE UserInfo
ADD CONSTRAINT PK_UserId PRIMARY KEY(UserId), -- 主鍵約束
CONSTRAINT CK_UserPwd CHECK(LEN(UserPwd)>=6), -- 唯一約束
CONSTRAINT CK_Gender CHECK(Gender=0 OR Gender=1), -- 唯一約束
CONSTRAINT DF_GENDER DEFAULT(0) FOR Gender, -- 預設約束
GO
複製程式碼
適用於表中沒有任何資料時,若有資料,會報錯
約束取名規則
推薦採用:約束型別_約束列
約束名 | 例如 |
---|---|
主鍵 (Primary Key) 約束 | PK_UserId |
唯一 (Unique Key) 約束 | UK_UserCardId |
預設 (Default Key) 約束 | DF_UserPasspwd |
檢查 (Check Key) 約束 | CK_Gender |
外來鍵 (Foreign Key) 約束 | FK_SortId |
語法_已存在資料
ALTER TABLE 表名 WITH NOCHECK
ADD CONSTRAINT 約束名 約束型別 具體的約束說明
E.g:
-- 向已存在資料的表中新增約束
ALTER TABLE Employee WITH NOCHECK
ADD CONSTRAINT CK_EmployeeId CHECK(LEN(EmployeeId)=18)
GO
複製程式碼
對錶中現有的資料不做檢查,只對新增約束後再錄入的資料進行檢查
刪除約束
ALTER TABLE 表名
DROP CONSTRAINT 約束名
E.g:
-- 刪除檢查約束
ALTER TABLE Employee
DROP CONSTRAINT CK_EmployeeId
GO
複製程式碼
- 有時候表之間存在關係,刪除約束時提示存在關係,這時需要先刪除主鍵
-- 先刪除主鍵
ALTER TABLE Employee
DROP CONSTRAINT PK_Employee
GO
-- 再刪除檢查約束
ALTER TABLE Employee
DROP CONSTRAINT CK_EmployeeId
GO
複製程式碼
資料庫關係圖
- 對特定的資料庫表進行視覺化管理與分析
- 一個資料庫中可以建立多個資料庫關係圖
刪除資料表
DROP TABLE 表名
E.g:
IF EXISTS (SELECT * FROM sysobjects WHERE name='CommodityInfo') -- 檢測要刪除的表是否存在
DROP TABLE CommodityInfo
複製程式碼