SQL Server中实现关系模型的阶梯到级别3t -SQL DML

格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09)

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/75775/

该系列

本文是系列的一部分:T-SQL的进阶

这个进阶将为您提供一个基本的理解,即如何使用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的关系建模概念现在是用来在SQL Server和其他关系数据库引擎中创建关系数据库的框架。

Codd出生于英格兰的波特兰岛,在加入皇家空军之前学习了数学和化学,成为了第二次世界大战的飞行员。1948年,他搬到纽约,开始在IBM工作,在那里他是一名数学程序员。他漂流了好几年,最终搬到加州,在IBM圣何塞研究实验室工作。直到20世纪90年代,当他的健康状况不佳迫使他退休时,Codd继续努力完善并证明了关系数据模型的合理性。 Edgar F. Codd 于2003年4月18日去世,享年79岁。

SQL Server中实现关系模型

这个楼梯不是用来教你关系数据建模,或数据库设计,而是教你如何从一个关系模型创建一个SQL Server数据库。但是在我为创建SQL Server数据库提供代码块之前,我们首先需要探索一个将被实现的关系数据模型。我的简单模型将包含一些实体(数据表),其中有主键定义和不同实体之间的一些关系(外键约束)。

我的简单的关系模型将是一个简单的酒店预订系统。这个预订系统需要跟踪客户预订信息。图1说明了这个简单的关系模型,我将使用t - sql实现它:

图1:一个简单的关系数据库模型,由6个表组成

通过回顾这个模型,您可以看到它包含许多实体(由方框表示)来跟踪预订相关信息。每个实体都由一些属性(列)组成,其中一个或多个属性被标识为主键(粗体和下划线的名称)。也表示实体之间的一些关系(以箭头表示),以显示不同的实体之间是如何相互关联的。我将使用实体、属性、主键和关系的模型,然后开发一个物理SQL Server数据库,它表示此关系模型的设计。

要从这个模型构建物理数据库,我们需要在SQL Server中识别基于此模型定义的不同对象。对于图1中的每个实体或框,我将在SQL Server中创建一个表。对于每个实体的每个属性,我将在关联的表中创建一个列。对于每个主键,我将创建一个唯一的集群索引(注意,使用唯一的非聚集索引也可以创建主键)。更多信息索引参考索引在http://www.sqlservercentral.com/stairway/72399/上楼梯)。最后,对于每个关系,我将创建一个外键约束。

要开始构建我的数据库,我首先需要创建一个SQL Server数据库来保存我计划创建的所有新数据库对象。我的数据库将被称为房间预订。我将使用以下的t - sql代码创建我的数据库:

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

地点:

<table_name> =表名

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

对于CREATE TABLE语句的完整语法,请参见联机的SQL Server Books。

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

清单1:创建Customer表

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

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

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

清单2:向Customer表添加主键约束

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

在transact - sql语言中,通常有不止一种方法可以做同样的事情。或者,通过运行清单3中的CREATE table语句,我可以一次性创建客户表和主键。

清单3:用主键创建Customer表的另一种方法

在这一点上,我已经向您展示了如何创建带有定义主键的表。剩下要展示的是如何创建外键约束。但在此之前,先让我先给您提供一个脚本,以在上面的关系数据库模型中创建其余的表和主键。您可以在清单4中找到它。

清单4:创建额外的表和主键约束

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

为了在关系模型中定义这些外键约束,我需要修改每个引用表来添加约束。清单5是我可以用来在保留表上创建外键约束的t - sql代码。这个约束确保记录不会被插入或更新到预订表中,除非在Customer表中基于CustomerId找到匹配的记录。

清单5:在引用Customer表的预订表上创建一个外键约束

为了完成我的设计,我需要实现图1中模型中所标识的所有其他外键constUNK。清单6包含ALTER TABLE语句,用以在我的数据模型中创建额外的外键约束。

清单6:创建额外的外键限制

验证数据库设计

一旦我完成了从数据模型构建数据库的工作,我应该验证所实现的设计,以确保它是正确的。这个验证过程是确保我在物理数据库中构建的所有数据完整性规则都正确地实现了。在我的设计中,我需要验证这些规则

﹒所有插入或更新的行必须对定义为NOT NULL的列有一个特定的值。

﹒主键的列不允许重复的值

﹒具有外键const晕倒的列不允许在引用表中没有匹配记录的数据

在验证数据完整性规则之前,我首先需要用一些有效数据填充引用的表。我将使用清单7中的代码来填充那些有一些有效数据的表:

清单7:插入初始数据

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

清单8:用INSERT语句测试各种约束

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

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

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

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

关系数据库设计

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

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

这篇文章是t - sql DML进阶的一部分

注册到我们的RSS频道,一旦我们在阶梯上发布一个新的级别,就会得到通知!

 

在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML的更多相关文章

  1. 到T-SQL DML 三级的阶梯:在SQL server中实现关系模型

    作者: Gregory Larsen, 2017/08/02 (第一次出版: 2011/11/09) 翻译:谢雪妮,许雅莉,赖慧芳,刘琼滨 译文: 系列 该文章是阶梯系列的一部分:T-SQL DML的 ...

  2. 在SQL Server中实现关系模型

    使用SQL Server的Transact-SQL(T-SQL)方言,此楼梯将为您提供如何使用SQL Server表中的数据的基本了解. DML是数据操作语言,是处理数据的语言的一个方面.它包括SEL ...

  3. 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志

    SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列   本文是Stairway系列的一部分:SQL ...

  4. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  5. sql server中对xml进行操作

    一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XM ...

  6. Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

    1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过row ...

  7. 转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

    0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Us ...

  8. SQL Server中的SQL语句优化与效率问题

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...

  9. SQL Server中的标识列

    一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: .列的数据类型为不带小数的数值类型 .在进行插入(Insert)操作时,该列的值是由 ...

随机推荐

  1. 201521123064 《Java程序设计》第8周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 集合内容见:<Java程序设计>第7周学习总结 1.2 选做:收集你认为有用的代码片段 ① Jav ...

  2. 201521123031 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  3. 陈敏-第一周Java课程总结

    一.本周学习总结 1.感受到JAVA的神奇魅力,以及其跨平台的优势 2.第一次接触感觉还是有很多不懂. 3.了解了JDK 二.书面作业 (一)为什么java程序可以跨平台运行?执行java程序的步骤是 ...

  4. 201521123011 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 协议.IP.域名.端口: 常用应用层协议:http, ftp 域名(通过域名可以找到IP)用ping测试 ...

  5. Java课程设计-计算器 郑子杰(201521123021)

    1.团队课程设计博客链接 http://www.cnblogs.com/I-love-java/p/7058752.html 2.个人负责模块或任务说明 ①图形界面的初始化 ②图形界面的排版设计 ③主 ...

  6. Java: 类继承中 super关键字

    super 关键字的作用有两个: 1)在子类中调用超类的构造器,完成实例域参数的初始化,调用构造器的语句只能作为另一个构造器(通常指的是子类构造器)的第一条语句出现, 2)在子类中调用超类的方法,如: ...

  7. Ansible系列(六):循环和条件判断

    本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...

  8. Linux 文件查找

    在Linux系统的查找相关的命令: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 whereis wher ...

  9. java中判断字符串是否为数字的方法的几种方法

    1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ ...

  10. AngularJS–Animations(动画)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/   在AngularJS 1.3 中,给一些指令(eg:   ngRepeat,ngSw ...