在使用數據庫時,絕大多數時間都是在使用基本表。
SQL Server數據類型
截圖來源: https://www.w3school.com.cn/sql/sql_datatypes.asp
創建基本表
基本格式如下:
create table <表名>
(
<列名1> <數據類型> [<列級完整性約束條件>],
……
<列名n> <數據類型> [<列級完整性約束條件>]
[, <表級完整性約束條件>]
)
如果完整性約束涉及到多個屬性列,則必須定義在表級上,否則可以定義在列級或表級。
如下創建一個Persons基本表:
use test -- 在該數據庫中創建基本表
go
create table Persons
(
Id_P int primary key, -- Id_P為主鍵
LastName nvarchar(20),
FirstName nvarchar(20),
Address nvarchar(50),
City nvarchar(10)
)
go
完整性約束
完整性約束的用途是限制輸入到基本表中的值的范圍,SQL的完整性約束可分為列級完整性約束和表級完整性約束:
- 列級完整性約束:針對關系屬性值的限定條件,只能應用在一列上
- 表級完整性約束:涉及關系中的多個屬性的限制條件,可以應用在一個基本表中的多個列上。
如果完整性約束涉及到多個屬性列,則必須定義在表級上,否則可以定義在列級或表級。當創建完整性約束之后,它作為基本表定義的一部分,存入數據字典中。
primary key約束
主鍵(primary key)約束是實體完整性約束,primary key用於定義主鍵,它保證主鍵的唯一性與非空性。一個基本表的主鍵由一列或者幾列構成,可以定義在列級或者表級上,但是不能在兩個級別上進行定義。
定義主鍵約束的方法如下:
-
primary key之間寫在列名及其數據類型之后。例如:
create table test ( col_name int primary key, …… )
-
按照語法在相應的列名及其數據類型后單獨列出:
constraint <約束名> primary key
約束名就是主鍵的名字。例如:
create table test ( col_name int constraint PK_name primary key, …… )
-
在create table語句中定義完所有列之后定義表級主鍵約束:
primary key (列名1, 列名2, ……)
或
constraint PK_name primary key (列名1, 列名2, ……)
例如:
create table test ( col_name1 int, col_name2 nvarchar(10), …… constraint PK_name primary key (col_name1, col_name2) )
foreign key約束
外鍵(foreign key)約束也稱為參照表約束,用於定義參照完整性,即用來維護兩個基本表之間的一致性關系。外鍵的建立主要是通過將一個基本表的主鍵(或者unique唯一性約束)所在的列包含在另一個表中,這些列就是另一個表的外鍵。
例如,因為銷售訂單和銷售人員之間存在一種邏輯關系,所以 Sales.SalesOrderHeader
表含有一個指向 Sales.SalesPerson
表的外鍵鏈接。 SalesOrderHeader
表中的 SalesPersonID
列與 SalesPerson
表中的主鍵列相對應。 SalesOrderHeader
表中的 SalesPersonID
列是指向 SalesPerson
表的外鍵。 通過創建此外鍵關系,如果 SalesPerson
表的主鍵中不存在 SalesPersonID
的值,則 SalesPersonID
的值將無法插入到 SalesOrderHeader
表。
外鍵的作用不只是對輸入自身表格的數據進行限制,同時也限制了對主鍵所在基本表的數據進行修改。主鍵所在的數據被另一張表的外鍵所引用時,用戶將無法對主鍵中的數據進行修改或者刪除,除非事先刪除或修改引用的數據。
foreign key約束定義外鍵的方法如下:
-
如果外鍵只有一列,可以在它的列名和類型后面直接用references說明它參照了某個基本表的某些列(必須為主鍵):
references <表名> (<列名>)
-
在屬性列表后面增加一個或幾個外鍵說明,其語法格式為:
foreign key (<列名>) references <表名> (<列名>)
其中,第一個列名是外鍵,第二個列名是被參照基本表中的列名。
-
在相應的列名及其類型后單獨列出並指定約束名,語法格式為:
constraint <約束名> foreign key (<列名>) references <表名> (<列名>)
unique約束
unique約束是唯一性約束,主要用來確保不受primary key約束的列上的數據的唯一性,兩者的區別主要表現如下:
- unique約束主要用在非主鍵的一列或者多列上要求數據唯一的情況。
- unique約束允許該列上存在NULL值,而主鍵不允許。
- 一個表可設置多個unique約束,但是只能有一個主鍵約束。
unique約束可以在列級和表級上設置,但是要在多個列上設置unique約束必須設置表級約束。
定義unique約束的方法:
-
unique約束直接寫在列名和數據類型之后
-
按照語法在相應的列名及其類型后單獨列出:
constraint <約束名> unique
-
表級unique約束:
constraint <約束名> unique (<列名1> [, <列名2>, <列名2>,……])
check約束
check約束時檢查約束,它通過檢查輸入表列的數據的值來維護值域的完整性,它依次檢查每一個要進入數據庫的數據,只有符合條件的數據才允許通過。check約束通過對一個邏輯表達式的結果進行判斷來對數據進行檢查。
default約束
default約束用於向列中插入默認值,如果沒有規定其他的值,則添加默認值到所有新記錄中。
not null或null約束
not null約束不允許列值為空,null約束允許列值為空。
create table 圖書
(
圖書號 varchar(15),
圖書名稱 varchar(30),
主編 varchar(30) not null,
出版社 varchar(15) default '清華大學出版社'
單價 float,
constraint CH_dj check (單價>=0 and 單價<=1000)
)