标签:server 修改 def 添加 语句 引用 init 特定 相关信息
楼梯到T-SQL DML等级3:在SQL Server中实现关系模型
作者:Gregory Larsen,2017/08/02(第一次发布:2011/11/09)
该系列
本文是楼梯系列的一部分:T-SQL DML的楼梯
使用SQL Server的Transact-SQL(T-SQL)方言,此楼梯将为您提供如何使用SQL Server表中的数据的基本了解。 DML是数据操作语言,是处理数据的语言的一个方面。它包括SELECT,INSERT,UPDATE和DELETE语句。这个楼梯还将提供SQL语言的一些历史和关于集合理论的一些一般概念。每个级别都将建立在先前的级别上,所以在完成之后,您将很好地了解如何从SQL Server中选择和修改数据。
在此楼梯的以前级别中,我向您提供了有关基本SELECT语句和SQL历史的信息。这些级别为您提供了理解如何检索数据的基础,以及随着技术和技术解决方案已经超时而改变了SQL环境的发展。在这个级别中,我将探索如何实现基于关系模型的简单SQL Server数据库。在创建数据库之前,首先让我分享关于关系模型创建者的一些历史。
关系数据建模之父
关系数据库设计的概念由Edgar F. Codd于1970年首次引入,题为“大型共享数据库数据的关系模型”。 Codd在IBM工作时开发了这种建模理论。 IBM对Codd的数据建模概念没有足够快的速度,因此不是首先提供利用Codd新关系数据建模理论的关系数据库引擎的供应商。 Codd的关系建模概念现在是用于在SQL Server和其他关系数据库引擎中创建关系数据库的框架。
Codd出生于英国的波特兰岛,并在加入皇家空军之前先后读数学和化学,成为二战的飞行员。他在1948年搬到纽约,开始为IBM工作,在那里他是一名数学程序员。他浮出了若干年,最后搬到了加利福尼亚州的IBM San Jose研究实验室工作。 Codd继续努力改进和证明关系数据模型的正当性,直到20世纪90年代,他的失败的健康迫使他退休。埃德加·科德德于2003年4月18日死于79岁。
在SQL Server中实现关系模型
这个楼梯不是教你关系数据建模或数据库设计,而只是向你展示如何从关系模型创建一个SQL Server数据库。但是,在我可以为您提供创建SQL Server数据库的代码块之前,我们首先需要探索将要实现的关系数据模型。我的简单模型将包含一些具有主键定义的实体(数据表)和不同实体之间的一些关系(外键约束)。
我简单的关系模式将是一个简单的酒店预订系统。该预订系统将需要跟踪客户预约信息。图1说明了我将使用T-SQL实现的简单关系模型:
CREATE DATABASE RoomReservation;
要从我的模型开始构建我的RoomReservation数据库对象,我将创建表对象。 要在SQL Server中创建表,我需要使用CREATE TABLE语句。 使用CREATE TABLE语句,我将能够定义每个表和每个表中的所有列。 以下是创建SQL Server表的简单语法:
CREATE TABLE <table_name> (
<column_definition> [,…N]);
清单3:使用PRIMARY KEY创建Customer表的另一种方法
在这一点上,我已经向您展示了如何使用定义的PRIMARY KEY创建表。 唯一可以告诉你的是如何创建FOREIGN KEY约束。 但在我可以这样做之前,让我首先提供您在上面的关系数据库模型中创建其余表和PRIMARY KEYS的脚本。 你可以在清单4中找到它。
清单4:创建附加表和PRIMARY KEY约束
FOREIGN KEY约束强制相互相关的两个表之间的引用完整性。定义外键约束的表是“引用表”,并且需要在另一个表中具有相关记录,称为“引用”表,任何时候在表中插入或更新行。 。在图1的关系模型中,这些外键关系用箭头表示。 FOREIGN KEY约束仅在关系中的一个表上定义。在我的图中,FOREIGN KEY约束将被定义在附加了箭头尾端(非尖端)的那些表上。
要在我的关系模型中定义这些FOREIGN KEY约束条件,我将需要更改每个引用表来添加约束。清单5是可用于在“预留”表上创建FOREIGN KEY约束的T-SQL代码。此约束确保在“预留”表中不会插入或更新记录,除非在Customer表中基于CustomerId找到匹配的记录。
清单5:在引用Customer表的Reservation表上创建FOREIGN KEY约束
为了完成我的设计,我需要实现在图1中我的模型中识别的所有其他外键constings。清单6包含在我的数据模型中创建附加外键约束的ALTER TABLE语句。
清单6:创建附加的FOREIGN KEY约束
验证数据库设计
一旦我完成了从数据模型构建数据库,我应该验证实现的设计,以确保它是正确的。 此验证过程是确保我内置到我的物理数据库中的所有数据完整性规则正确实施。 在我的设计中,我需要验证的规则
插入或更新的所有行必须为定义为NOT NULL的任何列定义特定的值。
PRIMARY KEY的列不允许重复的值
具有外键常量的列不允许在引用的表中没有匹配记录的数据
在我可以验证数据完整性规则之前,我首先需要使用一些有效的数据填充引用的表。 我将使用清单7中的代码来填充这些表与一些有效的数据:
清单7:插入初始数据
为了验证我内置到我的数据库中的数据完整性规则,我将运行清单8中的INSERT语句。
清单8:使用INSERT语句测试各种约束
这些INSERT语句中的每一个都应该失败,因为它们违反了在RoomReservation数据库中内置的数据完整性规则。第一个INSERT语句违反了ReservationStatusID列的NOT NULL验证检查。
第二个INSERT语句违反了放置在RoomType表上的PRIMARY KEY约束。此INSERT语句正在尝试为RoomTypeID列插入3的值。问题是RoomTypeID值为3的RoomType表中已经有一个记录。
最后一个INSERT语句违反了CustomerPaymentType表的FOREIGN KEY约束。在这个特定的INSERT语句中,Customer表中没有值为2的CustomerID。
要正确插入这些记录,插入的数据值将需要清理。一旦数据清理完毕,我将能够将这些新数据插入相应的表格。清单9包含清理的INSERT语句,它将传递所有数据完整性检查,并成功插入到RoomReservation数据库中的相应表中:
标签:server 修改 def 添加 语句 引用 init 特定 相关信息
原文地址:http://www.cnblogs.com/hhhhhhh/p/7722756.html