顶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 1

经过回顾这模型,您可望它含有众多实体(由方代表)来跟预订相关消息。每个实体都是因为一些性质(列)组成,其中一个或多只属性让标识也主键(粗体和下划线的号)。也代表实体之间的部分涉及(以箭头表示),以显示不同之实业之间是何许相互关联的。我拿使用实体、属性、主键和涉的模型,然后出一个大体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);

ALTER 

相关文章