到T-SQL DML 三級的階梯:在SQL server中實現關系模型
作者: Gregory Larsen, 2017/08/02 (第一次出版: 2011/11/09)
翻譯:謝雪妮,許雅莉,賴慧芳,劉瓊濱
譯文:
系列
該文章是階梯系列的一部分:T-SQL DML的階梯。
這個階梯將為您提供一個基本的理解,即如何使用SQL Server的翻譯 SQL(T- SQL)的方言和對SQL Server表格中的數據進行處理。DML是數據操縱語言,是處理數據的語言的方面。它包括語句選擇、插入、更新和刪除。這個階梯也將提供一些SQL語言的歷史和一些關於集合理論的一般概念。每一層都將建立在先前的水平之上,因此當您完成時,您將很好地了解如何從SQL Server中選擇和修改數據。
在上一級的樓梯上,我提供了關於基本選擇語句和SQL歷史的信息,這些級別為理解如何檢索數據以及SQL環境是如何演變的提供了基礎,因為技術和技術解決方案已經改變了超時工作。在這個級別,我將探索如何實現基於關系模型的簡單SQL Server數據庫。在開始創建數據庫之前,首先讓我介紹一下關系模型的創建者的一些歷史。
關系數據建模之父
關系數據庫設計的概念首先由Edgar F提出。. 在1970年,Codd發表論文的標題為“大型共享數據銀行的數據關系模型”。 Codd在IBM工作時開發了這種建模理論。BM在Codd的數據建模概念上跳得不夠快,因此並不是第一個供應關系數據庫引擎的供應商,它利用了Codd的新關系數據建模理論。Codd的關系建模概念現在是用來在SQL Server和其他關系數據庫引擎中創建關系數據庫的框架。Codd出生於英格蘭的波特蘭島,在加入皇家空軍之前學習了數學和化學,成為了第二次世界大戰的飛行員1948年,他搬到紐約,開始在IBM工作,在那裏他是一名數學程序員。他漂流了好幾年,最終搬到加州,在IBM聖何塞研究實驗室工作。直到20世紀90年代,當他的健康狀況不佳迫使他退休時,Codd繼續努力完善並證明了關系數據模型的合理性。2003年4月18日,Codd去世,享年79歲。
在SQL Server中實現關系模型
這個階梯不是用來教你關系數據建模,或數據庫設計,而是教你如何從一個關系模型創建一個SQL Server數據庫。但是在我為創建SQL Server數據庫提供代碼塊之前,我們首先需要探索一個將被實現的關系數據模型。我的簡單模型將包含一些實體(數據表),其中有主鍵定義和不同實體之間的一些關系(外鍵約束)。
我的簡單的關系模型將是一個簡單的酒店預訂系統。這個預訂系統需要跟蹤客戶預訂信息。圖1說明了這個簡單的關系模型,我將使用t - sql實現它:
通過回顧這個模型,您可以看到它包含許多實體(由方框表示)來跟蹤預訂相關信息。每個實體都由一些屬性(列)組成,其中一個或多個屬性被標識為主鍵(粗體和下劃線的名稱)。也表示實體之間的一些關系(以箭頭表示),以顯示不同的實體之間是如何相互關聯的。我將使用實體、屬性、主鍵和關系的模型,然後開發一個物理SQL Server數據庫,它表示此關系模型的設計。要從這個模型構建物理數據庫,我們需要在SQL Server中識別基於此模型定義的不同對象。對於圖1中的每個實體或框,我將在SQL Server中創建一個表。對於每個實體的每個屬性,我將在關聯的表中創建一個列。對於每個主鍵,我將創建一個唯一的集群索引(註意,使用唯一的非聚集索引也可以創建主鍵)。有關索引的更多信息,請參見http://www .sqlservercentral.com/stairway/72399/).。最後,對於每個關系,我將創建一個外鍵約束。要開始構建我的數據庫,我首先需要創建一個SQL Server數據庫來保存我計劃創建的所有新數據庫對象。我的數據庫將被稱為房間預訂。我將使用以下的t - sql代碼創建我的數據庫
CREATE DATABASE RoomReservation;
要從我的模型中開始構建我的房間預訂數據庫對象,我將創建表對象。要在sql server中創建一個表,我需要使用創建表語句。通過創建表語句,我將能夠定義每個表中的每個表和所有列。下面是創建SQL Server表的簡單語法
CREATE TABLE <table_name> (
<column_definition> [,…N]);
Where:
<table_name> = Name of table
<column_definition> = column_name data_type,[NULL | NOT NULL]
For complete syntax of the CREATE TABLE statement refer to SQL Server Books Online.
The first table I create will be the Customer table, created using the code in Listing 1.
USE RoomReservation;
GO
CREATE TABLE dbo.Customer (
CustomerId INT NOT NULL,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL,
Address1 NVARCHAR(100) NOT NULL,
Address2 NVARCHAR(100) NULL,
PhoneNumber NVARCHAR(22) NOT NULL,
EmailAddress VARCHAR(100) NULL,
City VARCHAR(100) NOT NULL,
StateProvince NVARCHAR(100) NOT NULL,
PostalCode NVARCHAR(100) NOT NULL);
清單1:創建Customer表
在這段代碼中,當我創建我的Customer表時,我創建了我需要的所有列,但我還指定了在插入或更新記錄時,該列是否需要一個值。我通過在某些列上指定非空值來實現這一點,而其他列則指定為空值。
如果一個列被定義為不為空,那意味著你不能創建一個記錄,除非你用一個實際值填充這個列。而使用空值規範定義一個列意味著您可以創建一行,而不必為這個列指定一個值,或者另一種方法是,該列允許空值。我在創建表的語句上面我允許列地址2和郵箱地址支持空值,而所有其他的柱子需要值將提供創建一個行時。
這個創建表語句並沒有完全定義我的客戶表,因為它是在我上面的關系數據庫模型中表示的。我還需要創建一個主鍵約束的列ID。這個主鍵約束將確保該表中沒有兩個記錄具有相同的客戶編號碼的值。這個主鍵約束將確保該表中沒有兩個記錄具有相同的客戶編號碼的值。創建主鍵的代碼如清單2所示
USE RoomReservation; GO CREATE TABLE dbo.Customer ( CustomerId INT NOT NULL CONSTRAINT PK_Customer PRIMARY KEY, FirstName NVARCHAR(50) NOT NULL, LastName NVARCHAR(50) NOT NULL, Address1 NVARCHAR(100) NOT NULL, Address2 NVARCHAR(100) NULL, PhoneNumber NVARCHAR(22) NOT NULL, EmailAddress NVARCHAR(100) NULL, City VARCHAR(100) NOT NULL, StateProvince NVARCHAR(100) NOT NULL, PostalCode NVARCHAR(100) NOT NULL);
清單2:向客戶表添加主鍵約束
此表語句向客戶表添加了主鍵約束。該主鍵將在聚集索引命名pk_customer窗體的創建。在翻譯SQL語言中,通常有不止一種方法來做同樣的事情。另外,我可以通過運行清單3中的創建表語句一次性創建我的客戶表和主鍵。
USE RoomReservation;
GO
CREATE TABLE dbo.Customer (
CustomerId INT NOT NULL CONSTRAINT PK_Customer PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL,
Address1 NVARCHAR(100) NOT NULL,
Address2 NVARCHAR(100) NULL,
PhoneNumber NVARCHAR(22) NOT NULL,
EmailAddress NVARCHAR(100) NULL,
City VARCHAR(100) NOT NULL,
StateProvince NVARCHAR(100) NOT NULL,
PostalCode NVARCHAR(100) NOT NULL);
清單3:用主鍵創建客戶表的另一種方法
在這一點上,我已經向您展示了如何創建具有定義主鍵的表。唯一要展示給您的是如何創建外鍵約束。但在此之前,讓我先向您提供創建上述關系數據庫模型中其余表和主鍵的腳本。您可以在清單4中找到它。
USE RoomReservation;
GO
CREATE TABLE dbo.Reservation (
ReservationId INT NOT NULL,
ArrivalDate DATETIME NOT NULL,
DepartureDate DATETIME NOT NULL,
DailyRate SMALLMONEY NOT NULL,
ReservationStatusID INT NOT NULL,
CustomerId INT NOT NULL,
RoomTypeID INT NOT NULL);
ALTER TABLE dbo.Reservation ADD CONSTRAINT
PK_Reservation PRIMARY KEY CLUSTERED (ReservationId);
CREATE TABLE dbo.RoomType (
RoomTypeId INT NOT NULL,
RoomDesc NVARCHAR(1000) NOT NULL);
ALTER TABLE dbo.RoomType ADD CONSTRAINT
PK_RoomType PRIMARY KEY CLUSTERED (RoomTypeId);
CREATE TABLE dbo.ReservationStatus (
ReservationStatusId INT NOT NULL,
ReservationStatusDesc NVARCHAR(50) NOT NULL);
ALTER TABLE dbo.ReservationStatus ADD CONSTRAINT
PK_ReservationStatus PRIMARY KEY CLUSTERED (ReservationStatusId);
CREATE TABLE dbo.PaymentType (
PaymentTypeId INT NOT NULL,
PaymentTypeDesc NVARCHAR(50) NOT NULL);
ALTER TABLE dbo.PaymentType ADD CONSTRAINT
PK_PaymentType PRIMARY KEY CLUSTERED (PaymentTypeId);
CREATE TABLE dbo.CustomerPaymentType (
PaymentTypeId INT NOT NULL,
CustomerId INT NOT NULL,
PaymentNotes NVARCHAR(2000) NULL);