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

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

哪里:
<table_name> =表的名称
<column_definition> = column_name data_type,[NULL | NOT NULL]
有关CREATE TABLE语句的完整语法,请参阅SQL Server联机丛书。
我创建的第一个表将是使用清单1中的代码创建的Customer表。
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表
在这段代码中,当我创建了我的客户表时,我创建了我需要的所有列,但是我也指定了当这个表中插入或更新记录时,列是否需要一个值。我通过在某些列上指定NOT NULL来实现,而其他列我指定了NULL。
如果列被定义为NOT NULL,这意味着您无法创建记录,除非您使用实际值填充此列。而使用NULL规范定义列表意味着您可以创建一行而不指定此列的值,或者另一种方法是列允许NULL值。在我上面的CREATE TABLE语句中,我允许列Address2和EmailAddress支持NULL,而其余所有列需要在创建行时提供一个值。
此CREATE TABLE语句没有完全定义我的Customer表,因为它在上面的关系数据库模型中表示。我仍然需要在CustomerID列上创建一个主键约束。此主键约束将确保此表中没有两个记录具有相同的CustomerID值。创建该主键的代码在清单2中。
USE RoomReservation;
GO
ALTER TABLE dbo.Customer ADD CONSTRAINT
     PK_Customer PRIMARY KEY CLUSTERED (CustomerId);
清单2:将一个PRIMARY KEY约束添加到Customer表
此ALTER TABLE语句将一个主键约束添加到我的Customer表。 该主键将以名为PK_Customer的聚簇索引的形式创建。
在Transact-SQL语言中,通常有多种方法来做同样的事情。 或者,我可以通过运行清单3中的CREATE TABLE语句一次创建我的Customer表和主键。
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:使用PRIMARY KEY创建Customer表的另一种方法
在这一点上,我已经向您展示了如何使用定义的PRIMARY KEY创建表。 唯一可以告诉你的是如何创建FOREIGN KEY约束。 但在我可以这样做之前,让我首先提供您在上面的关系数据库模型中创建其余表和PRIMARY KEYS的脚本。 你可以在清单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);

清单4:创建附加表和PRIMARY KEY约束
FOREIGN KEY约束强制相互相关的两个表之间的引用完整性。定义外键约束的表是“引用表”,并且需要在另一个表中具有相关记录,称为“引用”表,任何时候在表中插入或更新行。 。在图1的关系模型中,这些外键关系用箭头表示。 FOREIGN KEY约束仅在关系中的一个表上定义。在我的图中,FOREIGN KEY约束将被定义在附加了箭头尾端(非尖端)的那些表上。
要在我的关系模型中定义这些FOREIGN KEY约束条件,我将需要更改每个引用表来添加约束。清单5是可用于在“预留”表上创建FOREIGN KEY约束的T-SQL代码。此约束确保在“预留”表中不会插入或更新记录,除非在Customer表中基于CustomerId找到匹配的记录。
USE RoomReservation;
GO
ALTER TABLE dbo.Reservation
ADD CONSTRAINT FK_Reservation_CustomerPaymentType FOREIGN KEY (CustomerId)
    REFERENCES dbo.Customer (CustomerID);
清单5:在引用Customer表的Reservation表上创建FOREIGN KEY约束
为了完成我的设计,我需要实现在图1中我的模型中识别的所有其他外键constings。清单6包含在我的数据模型中创建附加外键约束的ALTER TABLE语句。
USE RoomReservation;
GO
ALTER TABLE dbo.Reservation
ADD CONSTRAINT FK_Reservation_RoomType FOREIGN KEY (RoomTypeId)
    REFERENCES dbo.RoomType (RoomTypeId);
    
ALTER TABLE dbo.Reservation
ADD CONSTRAINT FK_Reservation_ReservationStatus FOREIGN KEY (ReservationStatusId)
    REFERENCES dbo.ReservationStatus (ReservationStatusId);    
    
ALTER TABLE dbo.CustomerPaymentType
ADD CONSTRAINT FK_CustomerPaymentType_PaymentType FOREIGN KEY (PaymentTypeId)
    REFERENCES dbo.PaymentType (PaymentTypeId);  
    
ALTER TABLE dbo.CustomerPaymentType
ADD CONSTRAINT FK_CustomerPaymentType_Customer FOREIGN KEY (CustomerId)
    REFERENCES dbo.Customer (CustomerId);   
清单6:创建附加的FOREIGN KEY约束
验证数据库设计
一旦我完成了从数据模型构建数据库,我应该验证实现的设计,以确保它是正确的。 此验证过程是确保我内置到我的物理数据库中的所有数据完整性规则正确实施。 在我的设计中,我需要验证的规则
插入或更新的所有行必须为定义为NOT NULL的任何列定义特定的值。
PRIMARY KEY的列不允许重复的值
具有外键常量的列不允许在引用的表中没有匹配记录的数据
在我可以验证数据完整性规则之前,我首先需要使用一些有效的数据填充引用的表。 我将使用清单7中的代码来填充这些表与一些有效的数据:
USE RoomReservation;
GO
SET NOCOUNT ON;
-- Create PaymentType records
INSERT INTO PaymentType VALUES(1,'Visa');
INSERT INTO PaymentType VALUES(2,'MasterCard');
INSERT INTO PaymentType VALUES(3,'American Express');
-- Create Customer 
INSERT INTO Customer VALUES 
    (1,'Greg','Larsen','123 Some Place'
      ,NULL,'123-456-7890',Null,'MyCity','MA','12345');
-- Create Reservation Status
INSERT INTO ReservationStatus VALUES (1,'Booked');
INSERT INTO ReservationStatus VALUES (2,'Cancelled');
-- Create Room Type
INSERT INTO RoomType VALUES (1,'Kingsize');
INSERT INTO RoomType VALUES (2,'Queen');
INSERT INTO RoomType VALUES (3,'Double');     
清单7:插入初始数据
为了验证我内置到我的数据库中的数据完整性规则,我将运行清单8中的INSERT语句。
USE RoomReservation;
GO
-- Violates NOT NULL constraint
INSERT INTO Reservation VALUES(1,'2011-8-1 5:00 PM'
                                ,'2011-8-2 9:00 AM' 
                                , 150.99,NULL,1,1);                                                                                                                                                          
-- Violates Primary Key Constraint
INSERT INTO RoomType VALUES (3,'Suite');  
-- Violates Foreign Key Constraint
INSERT INTO CustomerPaymentType VALUES (1,2,'Will need an internet connection');
清单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数据库中的相应表中:
USE RoomReservation;
GO
-- Violates NOT NULL constraint
INSERT INTO Reservation VALUES(1,'2011-8-1 5:00 PM'
                                ,'2011-8-2 9:00 AM' 
                                , 150.99,1,1,1);                                                                                                                                                          
-- Violates Primary Key Constraint
INSERT INTO RoomType VALUES (4,'Suite');  
-- Violates Foreign Key Constraint
INSERT INTO CustomerPaymentType VALUES (1,1,'Will need an internet connection');

单9:附加约束测试
关系数据库设计
我的预订示例演示了如何使用关系模型并使用它来实现SQL Server数据库。 通过使用NOT NULL,PRIMARY KEY和FOREIGN KEY constaints,我将数据完整性规则直接构建到我的数据库设计中。 这允许我在底层数据库定义中强制执行这些规则,而不必在我的业务处理层中编写代码来验证这些数据规则。 通过这样做,我允许SQL Server数据库引擎为我执行这些数据完整性检查。
通过围绕关系数据库模型了解和创建数据库设计,您将构建一个强大而高效的数据库实现,您可以在其中构建数据库中的数据完整性检查。

CREATE DATABASE RoomReservation的更多相关文章

  1. [解决方案]CREATE DATABASE statement not allowed within multi-statement transaction.

    CREATE DATABASE statement not allowed within multi-statement transaction. 刚开始报这个错误的时候,我上度娘搜了一下. 别人是在 ...

  2. SQL UNION 和 UNION ALL 操作符\SQL SELECT INTO 语句\SQL CREATE DATABASE 语句

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  3. 基于Apache+php+mysql的许愿墙网站的搭建create database xyq; //创建xyq数据库

    1.准备CentOS7与CentOS5的基础配置 2.在两台虚拟机中配置yum. 3.在CentOS7中安装httpd与php与php-mysql PS:截图时已安装 CentOS7 关闭防火墙与se ...

  4. odoo-10.0 create database 失败

    在初始化数据库的界面点击[create database] create database 失败 报错如下 2017-01-05 20:15:18,529 4652 INFO ? werkzeug: ...

  5. ORA-01501: CREATE DATABASE failed

    使用dbca建库时遇到ORA-01501: CREATE DATABASE failed这个错误,检查告警日志,发现有下面错误信息: SMON: enabling tx recovery Fri Ap ...

  6. CREATE DATABASE permission denied in database 'master'.

    EF Code first 建立数据库时报这个错误 CREATE DATABASE permission denied in database 'master'. 解决方法: 打开 Sql Serve ...

  7. mysql create database 指定utf-8编码

    CREATE DATABASE IF NOT EXISTS thinkphp  DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

  8. CREATE DATABASE

    CREATE DATABASE IF NOT EXISTS `focusdata` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE `fo ...

  9. CREATE DATABASE建库语句详解

    原创地址:http://blog.csdn.net/guguda2008/article/details/5716939 一个完整的建库语句是类似这样的: IF DB_ID('TEST') IS NO ...

随机推荐

  1. ng-model值字符串转数值型(convertToNumber directive)

    <select ng-model="model.id" convert-to-number> <option value="0">Zer ...

  2. 详解 HTTPS 移动端对称加密套件优

    近几年,Google.Baidu.Facebook 等互联网巨头大力推行 HTTPS,国内外的大型互联网公司很多也都已启用全站 HTTPS. Google 也推出了针对移动端优化的新型加密套件 Cha ...

  3. CA认证和颁发吊销证书

    摘要:涉及到网络安全这一块,想必大家都听过CA吧.像百度.淘宝.京东等这些知名网站,每年都要花费一笔money来买CA证书.但其实简单的企业内的CA认证,我们自己就可以实现,今天小编我就讲解一下怎么在 ...

  4. 自定义流程gooflow2.0+自定义表单

    一.功能简介 gooflow功能清单1.自定义流程绘制2.自定义属性添加3.支持3种步骤类型普通审批步骤自动决策步骤手动决策步骤 4.决策方式(支持js决策,sql语句决策) 5.审批人员参与方式,可 ...

  5. java初学者(新手)应该如何选择学习教材与网站

    作者:天天向上 1.学习教材选择推荐<JAVA核心技术>,想多看点代码多练习可以找<java开发实战经典>&amp;amp;lt;img src="https ...

  6. H5上传图片并使用canvas制作海报

    马上就要"十一"国庆节了,又恰逢公司已经三周岁了,所以市场部和产品共同策划了一个"正青春,共成长"的主题代言活动,准备在国庆节以及中秋节期间让公司员工和用户为公 ...

  7. 云计算-openstack基础构架以及服务方式详解

    一:什么是openstack 是Rackspace(美国航天局)和NASA(一家公司)共同发起的开源项目,他是一系列软件项目的组合. 这些项目是松耦合的关系,可以进行独立的安装,启动和停止,只有在必要 ...

  8. Dice (II) (DP)唉,当时没做出来

    Dice (II) Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu [Submit]   [ ...

  9. python爬取煎蛋网图片

    ``` py2版本: #-*- coding:utf-8 -*-#from __future__ import unicode_literimport urllib,urllib2,timeimpor ...

  10. c# 多线程传递参数以及任务

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...