第五周翻译

这篇文章是了解SOL系列的一部分:通往T-SQLDML的快速方法。

他通过使用SQL Server的Transact-SQL (T-SQL)语言,这篇文章将为您提供如何使用SQL Server表数据的基本理解。DML是数据处理语言,是处理数据的语言的方面。它包括语句选择、插入、更新和删除。这篇文章将提供一些SQL语言的历史和一些关于理论的一般概念。每个等级都将建立在之前等级上,所以当你完成时,你将很好地理解怎么从SQL Server中选择和修改数据。

在这个文章的第一级,我向你提供了关于基本选择语句和一些SQL历史的信息。这一等级为你提供了理解如何检索数据以及SQL环境如何随着技术和技术解决方案发生变化而变化的基础。在这个等级上,我将探讨如何实现在关系模型之上的简单SQL Server数据库。在开始创建数据库之前,首先让我介绍一下关系模型的创建者的一些历史。

关系数据建模之父

关系数据库设计的概念最初是由Edgar F. Codd在1970年提出的,论文标题是“大型共享数据银行的数据关系模型”。Codd在IBM工作时开发了这个。IBM认为Codd的数据建模概念上的速度不够快,因此Codd并不是第一个提供关系数据库引擎,但是却利用了Codd的新关系数据建模理论。Codd的关系建模概念现在是用于在SQL Server和其他关系数据库引擎之间创建数据库的框架。

Codd出生在英国的波特兰岛,在加入皇家空军成为二战飞行员之前,他学习了数学和化学。1948年他搬到纽约,开始在IBM工作,他是一名数学程序员。他漂流了好几年,最终搬到加利福尼亚,在IBM圣何塞研究实验室工作。Codd继续致力于完善和证明关系数据模型,直到上世纪90年代由于健康问题而退休。他于2003年4月18日去世,享年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代码创建我的数据库:

CREATEDATABASE RoomReservation;

要从我的模型中开始构建我的房间预订数据库对象,我将创建表对象。要在SQL Server中创建表,我需要使用创建列表语句。使用创建列表语句,我将能够定义每个表和每个表中的所有列。下面是创建SQL Server表的简单语法:

CREATE TABLE <table_name> (
<column_definition> [,…N]);

地点:

 

<table_name> = Name of table

<column_definition> = column_name data_type,[NULL | NOT NULL]

对于创建列表语句的完整语法,请参阅联机的SQL Server书籍。

我创建的第一个表将是Customer表,它是使用Listing1中的代码创建的。

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);

Listing 1:创建顾客表

在此代码中,当我创建顾客表时,我创建了所需的所有列,但我还指定了在插入或更新记录时,该列是否需要一个值。我通过在某些列上指定NOT NULL实现了这一点,而其他列则指定为NULL。

如果一个列被定义为NOT NULL,那意味着不能创建一个列,除非用一个实际值填充这个列。然而,使用NULL规范定义一个列意味着可以创建一个行,而无需为这个列指定一个值,或者另一种方法是该列允许空值。在上面的CREATE TABLE语句中,我允许列Address2和EmailAddress支持null,而所有其他列都需要在创建行时提供一个值。

这个创建表语句并没有完全定义我的顾客表,因为它在上面的关系数据库模型中表示。我仍然需要在列CustomerID上创建一个主键约束。这个主键约束将确保该表中没有两个记录具有相同的CustomerID值。创建主键的代码如Listing 2所示。

USE RoomReservation;
GO
ALTER TABLE dbo.Customer ADD CONSTRAINT
     PK_Customer PRIMARY KEY CLUSTERED (CustomerId);

Listing 2:在Customer表中添加主键约束

这个ALTER TABLE语句为我的Customer表添加了一个主键约束。主键将以一个名为PK-Customer的聚集索引的形式创建。

在Transact-SQL语言中,通常有不止一种方法来做相同的事情。或者,可以通过运行Listing3中的CREATE table语句,一次性创建表和主键。

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);

Listing 3:用主键创建Customer表

目前来说,我已经展示了如何创建具有定义主键的表,剩下要展示的是如何使用外键约束。但先让我提供在我的关系数据库模型中创建其余表和主键的脚本。你可以在Listing 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);
 
ALTER TABLE dbo.CustomerPaymentType ADD CONSTRAINT
    PK_CustomerPaymentType PRIMARY KEY CLUSTERED (PaymentTypeId, CustomerId);

Listing4:创建附加表和主键约束

一个外键约束加强了两个相互关联的表之间的引用完整性。外键约束定义的表是“引用表”,需要在另一个表中有相关记录,被称为“引用表”,任何时候在表中插入或更新一行,在图1的关系模型中,这些外键关系由箭头表示。外键约束仅在关系中的一个表上定义,在我的图表中,外键约束将定义在具有箭头(非指向端)尾部的表上。

为了在我的关系模型中定义这些外键限制,我需要修改每个引用表来添加约束。清单5是我可以用来在预约表上创建外键约束的T-SQL代码。这个约束确保记录不会在预约表中插入或更新,除非根据客户编号在客户表中找到匹配的记录。

Listing5:在预订表中创建一个外键约束来引用客户表。

为了完成我的设计,我需要实现图1中模型中标识的所有其他外键惯性。清单6包含更改的表语句来创建我的数据模型中额外的外键约束。

Listing6:创建额外的外键限制。

验证数据库设计一旦我完成了从数据模型构建数据库的工作,我应该验证实现的设计以确保它是正确的。这个验证过程是为了确保我在物理数据库中构建的所有数据完整性规则都得到了正确的实现。在我的设计中,我需要验证这些规则。插入或更新的所有行必须为定义为非空的任一列定义特定的值。主键的列不允许重复值,有外键的列能在引用表中没有匹配记录的数据,在验证数据完整性规则之前,首先需要使用一些有效数据填充引用的表。我将使用清单7中的代码来填充那些具有一些有效数据的表:

Listing 7:插入初始数据。

为了验证我在数据库中构建的数据完整性规则,我将运行第8项中的INSERT语句。

Listing 8用INSERT语句测试各种约束。

这些INSERT语句中的每一个都应该失败,因为它们违反了在RoomReservation数据库中构建的数据完整性规则。第一个INSERT语句违背了保留区雕像栏的非空验证检查。

第二个INSERT语句违背了放在RoomType表上的主键约束。这个INSERT语句试图为RoomTypeID列插入3的值。问题是,房间类型表中已经有了一个记录,它的RoomTypeID值为3。

最后一个INSERT语句违反了CustomerPaymentType表的外键约束。在这个特定的INSERT语句中,在Customer表中没有CustomerID,值为2。

要正确插入这些记录,需要清理插入的数据值。一旦数据被清理干净,我就可以将这些新数据插入到适当的表中。清单9包含清理的INSERT语句,它将传递所有数据完整性检查,并成功地插入到RoomReservation数据库中的适当表中:

Listing9  :附加的约束测试。

关系数据库设计

我的预订示例演示了如何使用关系模型并使用它来实现一个SQL Server数据库。通过使用NOT NULL、主键和外键const,我将数据完整性规则构建到数据库设计中。这允许我在底层数据库定义中执行这些规则,而不是在业务处理层中编写代码来验证这些数据规则。通过这样做,我允许SQL Server数据库引擎为我执行这些数据完整性检查。

通过了解和创建围绕关系数据库模型的数据库设计,您将构建一个健壮的、高效的数据库实现,您可以在数据库中构建数据完整性检查。

这篇文章是 Stairway to T-SQL DML 的一部分。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值