[SQL]基本表的定義及其完整性約束


在使用數據庫時,絕大多數時間都是在使用基本表。

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用於定義主鍵,它保證主鍵的唯一性與非空性。一個基本表的主鍵由一列或者幾列構成,可以定義在列級或者表級上,但是不能在兩個級別上進行定義。

定義主鍵約束的方法如下:

  1. primary key之間寫在列名及其數據類型之后。例如:

    create table test
    (
    	col_name int primary key,
        ……
    )
    
  2. 按照語法在相應的列名及其數據類型后單獨列出:

    constraint <約束名> primary key
    

    約束名就是主鍵的名字。例如:

    create table test
    (
    	col_name int constraint PK_name primary key,
        ……
    )
    
  3. 在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約束定義外鍵的方法如下:

  1. 如果外鍵只有一列,可以在它的列名和類型后面直接用references說明它參照了某個基本表的某些列(必須為主鍵):

    references <表名> (<列名>)
    
  2. 在屬性列表后面增加一個或幾個外鍵說明,其語法格式為:

    foreign key (<列名>) references <表名> (<列名>)
    

    其中,第一個列名是外鍵,第二個列名是被參照基本表中的列名。

  3. 在相應的列名及其類型后單獨列出並指定約束名,語法格式為:

    constraint <約束名> foreign key (<列名>) references <表名> (<列名>)
    

unique約束

unique約束是唯一性約束,主要用來確保不受primary key約束的列上的數據的唯一性,兩者的區別主要表現如下:

  1. unique約束主要用在非主鍵的一列或者多列上要求數據唯一的情況。
  2. unique約束允許該列上存在NULL值,而主鍵不允許。
  3. 一個表可設置多個unique約束,但是只能有一個主鍵約束。

unique約束可以在列級和表級上設置,但是要在多個列上設置unique約束必須設置表級約束。

定義unique約束的方法:

  1. unique約束直接寫在列名和數據類型之后

  2. 按照語法在相應的列名及其類型后單獨列出:

    constraint <約束名> unique
    
  3. 表級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)
)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM