1. ----用游标删除已经存在的外键  
  2. DECLARE @fk_name       VARCHAR(50)  
  3. DECLARE @fk_schName    VARCHAR(50)  
  4. DECLARE @obj_name      VARCHAR(50)  
  5. DECLARE @obj_schName   VARCHAR(50)  
  6. DECLARE @sqlstring     VARCHAR(5000)  
  7. DECLARE myCursor Cursor FOR SELECT sys.foreign_keys.name AS fk_name,sys.schemas.name AS fk_schName,sys.objects.name AS obj_name,schemas_1.name AS obj_schName FROM sys.foreign_keys INNER JOIN sys.objects ON sys.foreign_keys.parent_object_id=sys.objects.object_id INNER JOIN sys.schemas ON sys.foreign_keys.schema_id =sys.schemas.schema_id  INNER JOIN sys.schemas As Schemas_1 ON sys.objects .schema_id=schemas_1.schema_id   
  8. OPEN myCursor  
  9. FETCH FROM myCursor INTO @fk_name,@fk_schName,@obj_name,@obj_schName  
  10. WHILE @@FETCH_STATUS =0  
  11. BEGIN 
  12.   SET @sqlstring='ALTER TABLE [' + @obj_schName +'].['+ @obj_name + '] DROP CONSTRAINT ' + @fk_name  
  13.   EXEC(@sqlstring)  
  14.   FETCH FROM myCursor INTO @fk_name,@fk_schName,@obj_name,@obj_schName  
  15. END    
  16. DEALLOCATE myCursor  
  17.  
  18. ----判断目标表是否已经存在,如果存在,则删除目标表  
  19. IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Customers].[Customer]'AND type IN (N'U'))  
  20. DROP TABLE Customers.Customer  
  21. Go  
  22. CREATE TABLE Customers.Customer  
  23. (CustomerID               VARCHAR(30)       NOT NULL,                 ----客户编码  
  24.  CompanyName              VARCHAR(100)      NOT NULL,                 ----客户名称  
  25.  ContactID                VARCHAR(20)       NOT NULL,                 ----联系人ID  
  26.  CustomerPrimaryAddress   VARCHAR(20)           NULL,                 ----客户地址(主地址)  
  27.  CreateDate               DATE                  NULL,                 ----创建日期  
  28.  EmailAddress             VARCHAR(50)    SPARSE NULL,                 ----客户Email地址                             ----定义一个稀疏列  
  29.  CONSTRAINT ck_createdate CHECK (CreateDate>'2012-02-01'),                                                          ----定义一个CHECK类型的约束,限制保存的值  
  30.  CONSTRAINT Pk_Customer PRIMARY KEY (CustomerID))                                                                   ----定义一个主键类型的约束  
  31.  Go  
  32.    
  33.  ----判断目标约束是否存在,如果存在,则删除目标约束(删除CHECK类型的约束(ck_createdate))  
  34.  IF EXISTS(SELECT * FROM sys.check_constraints WHERE object_id=OBJECT_ID(N'[Customers].[ck_createdate]'AND parent_object_id=OBJECT_ID(N'[Customers].[Customer]'))  
  35.  ALTER TABLE Customers.Customer DROP CONSTRAINT ck_createdate                                                         
  36.  GO  
  37.  ----说明:  
  38.  ----以下语句是在表中增加一个CHECK类型的约束,并对已经存在于表的数据进行检查(WITH CHECK)  
  39.  ----ALTER TABLE Customers.Customer WITH CHECK ADD CONSTRAINT ck_createdate CHECK (CreateDate>='2012-02-01')            ----重新定义一个CHECK类型的约束  
  40.  ----以下语句是在表中增加一个CHECK类型的约束,并对已经存在于表的数据不进行检查(WITH NOCHECK)  
  41.  ALTER TABLE Customers.Customer WITH NOCHECK ADD CONSTRAINT ck_createdate CHECK (CreateDate>='2012-02-01')            ----重新定义一个CHECK类型的约束  
  42.    
  43.  ----判断目标表是否已经存在,如果存在,则删除目标表  
  44.  IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[Customers].[CustomerAddress]'AND type IN (N'U'))  
  45.  DROP TABLE Customers.CustomerAddress  
  46.  Go  
  47.  CREATE TABLE Customers.CustomerAddress  
  48.  (CustomerAddressID       VARCHAR(30)        NOT NULL,                                                   ----客户地址ID  
  49.   AddressTypeID           VARCHAR(2)         NOT NULL,                                                   ----地址类型ID  (也可以定义为:AddressTypeID   VARCHAR(2)  NOT NULL CONSTRAINT ck_addresstype CHECK (AddressTypeID IN ('01','02','03'))  
  50.   AddressLine1            VARCHAR(50)        NOT NULL,                                                   ----地址行1  
  51.   AddressLine2            VARCHAR(50)     SPARSE NULL,                                                   ----地址行2  
  52.   City                    VARCHAR(30)        NOT NULL,                                                   ----城市  
  53.   StateProvince           VARCHAR(30)        NOT NULL,                                                   ----省  
  54.   Country                 VARCHAR(30)        NOT NULL,                                                   ----国家  
  55.   CustomerID              VARCHAR(30)        NOT NULL,                                                   ----客户编码  
  56.   CONSTRAINT ck_addresstype CHECK (AddressTypeID IN ('01','02','03')),                                   ----定义一个CHECK类型的约束,限定AddressType的值必须在指定的值      
  57.   CONSTRAINT pk_CustomerAddress PRIMARY KEY (CustomerAddressID),                                         ----定义一个主键类型的约束  
  58.   CONSTRAINT fk_customeraddress FOREIGN KEY (CustomerID) REFERENCES Customers.Customer(CustomerID))      ----定义一个外键类型的约束  
  59.   Go  
  60.    
  61.  ----创建订单主表  
  62.  IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[Orders].[OrderHeader]'AND type IN (N'U'))  
  63.  DROP TABLE Orders.OrderHeader  
  64.  GO  
  65.     
  66.  CREATE TABLE Orders.OrderHeader  
  67.  (OrderID          VARCHAR(30)               NOT NULL,                                                   ----订单主表ID号  
  68.   OrderDate        DATE                      NOT NULL,                                                   ----订单日期  
  69.   CustomerID       VARCHAR(30)               NOT NULL,                                                   ----客户编码  
  70.   EmployeeID       VARCHAR(30)                   NULL,                                                   ----业务员编码  
  71.   PayID            VARCHAR(30)                   NULL,                                                   ----付款方式编码  
  72.   SALEID           BIT                       NOT NULL CONSTRAINT dt_saleid DEFAULT(0),                   ----销售类型(0:正常销售,1:销售退回)  
  73.   Memo             VARCHAR(500)        SPARSE    NULL,                                                   ----备注  
  74.   CONSTRAINT pk_orderheader PRIMARY KEY (OrderID),  
  75.   CONSTRAINT fk_orderheadercustomer FOREIGN KEY (CustomerID) REFERENCES Customers.Customer(CustomerID))  
  76.   Go  
  77.      
  78.   ----创建订单子表  
  79.   IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[Orders].[OrderDetails]'AND type IN (N'U'))  
  80.   DROP TABLE Orders.OrderDetails  
  81.   Go  
  82.      
  83.   CREATE TABLE Orders.OrderDetails  
  84.   (ID                   UNIQUEIDENTIFIER            NOT NULL DEFAULT NEWID(),                                   ----订单子表ID号  
  85.    OrderID              VARCHAR(30)                 NOT NULL,                                                   ----订单主表ID号  
  86.    ProductID            VARCHAR(40)                 NOT NULL,                                                   ----产品ID号  
  87.    Quantity             DECIMAL(12,6)               NOT NULL CHECK (Quantity>0),                                ----数量  
  88.    Price                MONEY                       NOT NULL CHECK (Price>0),                                   ----单价  
  89.    TAX                  MONEY                       NOT NULL CONSTRAINT dt_tax DEFAULT(0) CHECK(TAX>=0),        ----税额  
  90.    [Money]                                          AS (Quantity+Price+TAX),                                    ----价税合计  
  91.    DispatchDate         DATE                            NULL,                                                   ----要求发货日期  
  92.    Present              BIT                         NOT NULL CONSTRAINT dt_present DEFAULT(0),                  ----是否赠品  
  93.    CustomerAddressID    VARCHAR(30)                 NOT NULL,                                                   ----客户收货地址  
  94.    CONSTRAINT pk_orderdetails PRIMARY KEY(ID),  
  95.    CONSTRAINT fk_orderdetailsorder FOREIGN KEY (OrderID) REFERENCES Orders.OrderHeader (OrderID),  
  96.    CONSTRAINT fk_orderdetailsaddress FOREIGN KEY (CustomerAddressID) REFERENCES Customers.CustomerAddress(CustomerAddressID))  
  97.    Go  
  98.      
  99.   ---创建产品类别表  
  100.   IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[Products].[ProductType]'AND type IN (N'U'))  
  101.   DROP TABLE Products.ProductType  
  102.   GO  
  103.       
  104.   CREATE TABLE Products.ProductType  
  105.   (ProductTypeID        VARCHAR(30)               NOT NULL,  
  106.    ProductTypeName      VARCHAR(50)               NOT NULL,  
  107.    CONSTRAINT pk_producttype PRIMARY KEY (ProductTypeID))  
  108.    Go  
  109.     
  110.   ----创建产品信息表  
  111.   IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[Products].[Product]'AND type IN (N'U'))  
  112.   DROP TABLE Products.Product  
  113.   Go  
  114.        
  115.   CREATE TABLE Products.Product  
  116.   (ProductID            VARCHAR(30)               NOT NULL,  
  117.    ProductName          VARCHAR(50)               NOT NULL,  
  118.    ProductStandard      VARCHAR(50)                   NULL,  
  119.    UnitName             VARCHAR(20)               NOT NULL,  
  120.    ModifiyDate          DATE                      NOT NULL CONSTRAINT dt_modifiydate DEFAULT(getdate()),  
  121.    CONSTRAINT pk_product PRIMARY KEY (productID))  
  122.   GO  
  123.     
  124.   ----创建产品图片表  
  125.   IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[Products].[ProductPicture]'AND type IN (N'U'))  
  126.   DROP TABLE Products.ProductPicture  
  127.   Go  
  128.         
  129.   CREATE TABLE Products.ProductPicture  
  130.   (ID                 UNIQUEIDENTIFIER ROWGUIDCOL    NOT NULL  UNIQUE,  
  131.    ProductID          VARCHAR(30)                    NOT NULL,  
  132.    ProductPicture     VARBINARY(MAX)   FILESTREAM        NULL,  
  133.    CONSTRAINT pk_productpicture PRIMARY KEY (ID),  
  134.    CONSTRAINT fk_productpicture FOREIGN KEY (ProductID) REFERENCES Products.Product(ProductID))  
  135.   GO  
  136.     
  137.   ----创建职员表  
  138.   IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[HumanResources].[Employee]'AND type IN (N'U'))  
  139.   DROP TABLE HumanResources.Employee  
  140.   GO  
  141.     
  142.   CREATE TABLE HumanResources.Employee  
  143.   (EmployeeID          VARCHAR(30)            NOT NULL,  
  144.    FirstName           VARCHAR(50)            NOT NULL,  
  145.    MiddleName          VARCHAR(50)    SPARSE      NULL,  
  146.    LastName            VARCHAR(50)            NOT NULL,  
  147.    JobTitle            VARCHAR(30)                NULL,  
  148.    BirthDay            DATE                       NULL CONSTRAINT ck_birthday CHECK (DATEDIFF(YEAR,Birthday,GETDATE())>=18),  
  149.    HireDate            DATE                   NOT NULL CONSTRAINT dt_hiredate DEFAULT(GETDATE()),-- CONSTRAINT ck_hiredate CHECK (DATEDIFF(YEAR,HireDate,(CASE WHEN Birthday IS NULL THEN DATEADD(YEAR,18,HireDate) ELSE Birthday END))>=18),  
  150.    CONSTRAINT pk_employee PRIMARY KEY (EmployeeID))  
  151.   GO  
  152.     
  153.     
  154.   ----创建职员联系地址表  
  155.   IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[HumanResources].[EmployeeAddress]'AND type IN (N'U'))  
  156.   DROP TABLE HumanResources.EmployeeAddress  
  157.   GO  
  158.     
  159.   CREATE TABLE HumanResources.EmployeeAddress  
  160.   (AddressID           VARCHAR(30)            NOT NULL CONSTRAINT pk_employeeaddress PRIMARY KEY (AddressID),  
  161.    AddressType         VARCHAR(2)             NOT NULL CONSTRAINT ck_addresstype CHECK (AddressType IN ('01','02','03')),  
  162.    AddressLine1        VARCHAR(50)            NOT NULL,  
  163.    AddressLine2        VARCHAR(50)    SPARSE      NULL,  
  164.    AddressLine3        VARCHAR(50)    SPARSE      NULL,  
  165.    City                VARCHAR(50)            NOT NULL,  
  166.    StateProvince       VARCHAR(50)            NOT NULL,  
  167.    Country             VARCHAR(30)            NOT NULL,  
  168.    EmployeeID          VARCHAR(30)            NOT NULL CONSTRAINT fk_employeeaddress FOREIGN KEY (EmployeeID) REFERENCES HumanResources.Employee(EmployeeID))  
  169.    GO  
  170.     
  171.   ----为OrderHeader表增加外键  
  172.   IF EXISTS(SELECT * FROM sys.foreign_keys WHERE object_id=OBJECT_ID(N'[Orders].[fk_orderheaderemployee]'AND parent_object_id=OBJECT_ID(N'[Orders].[OrderHeader]'))  
  173.   ALTER TABLE Orders.OrderHeader DROP CONSTRAINT fk_orderheaderemployee  
  174.   GO  
  175.   ALTER TABLE Orders.OrderHeader WITH CHECK ADD CONSTRAINT fk_orderheaderemployee FOREIGN KEY (EmployeeID) REFERENCES HumanREsources.Employee(EmployeeID)  
  176.   GO  
  177.     
  178.   ----创建国家信息表  
  179.   IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[LookupTables].[Country]'AND type IN (N'U'))  
  180.   DROP TABLE LookupTables.Country  
  181.   GO  
  182.   CREATE TABLE LookupTables.Country  
  183.   (CountryID       VARCHAR(30)      NOT NULL,  
  184.    CountryName     VARCHAR(70)      NOT NULL UNIQUE,  
  185.    CONSTRAINT pk_country PRIMARY KEY (CountryID))  
  186.   GO  
  187.     
  188.   ----为CustomerAddress表增加外键  
  189.   IF EXISTS(SELECT * FROM sys.foreign_keys WHERE object_id=OBJECT_ID(N'[Customers].[fk_customeraddresscountry]'AND parent_object_id=OBJECT_ID(N'[Customers].[CustomerAddress]'))  
  190.   ALTER TABLE Customers.CustomerAddress DROP CONSTRAINT fk_customeraddresscountry  
  191.   GO  
  192.   ALTER TABLE Customers.CustomerAddress WITH CHECK ADD CONSTRAINT fk_customeraddresscountry FOREIGN KEY (Country) REFERENCES LookupTables.Country(CountryID)  
  193.   GO  
  194.   ----为EmployeeAddress表增加外键  
  195.   IF EXISTS(SELECT * FROM sys.foreign_keys WHERE object_id=OBJECT_ID(N'[HumanResources].[fk_employeeaddresscountry]'AND parent_object_id=OBJECT_ID(N'[HumanResources].[EmployeeAddress]'))  
  196.   ALTER TABLE HumanResources.EmployeeAddress DROP CONSTRAINT fk_employeeaddresscountry  
  197.   GO  
  198.   ALTER TABLE HumanResources.EmployeeAddress WITH CHECK ADD CONSTRAINT fk_employeeaddresscountry FOREIGN KEY(Country) REFERENCES LookupTables.Country(CountryID)  
  199.   GO  
  200.     
  201.  ----修改Product表,增加ProductTypeID列,并增加外建  
  202.   ALTER TABLE Products.Product ADD ProductTypeID VARCHAR(30) NOT NULL 
  203.   GO  
  204.   IF EXISTS(SELECT * FROM sys.foreign_keys WHERE object_id=OBJECT_ID(N'fk_producttype'AND parent_object_id=OBJECT_ID(N'[Products].[Product]'))  
  205.   ALTER TABLE Products.Product DROP CONSTRAINT fk_producttype  
  206.   GO  
  207.   ALTER TABLE Products.Product WITH CHECK ADD CONSTRAINT fk_producttype FOREIGN KEY(ProductTypeID) REFERENCES Products.ProductType  
  208.   GO  
  209.     
  210.   ----修改OrderDetails表的ProductID列,并增加外建  
  211.   ALTER TABLE Orders.OrderDetails ALTER COLUMN ProductID VARCHAR(30) NOT NULL 
  212.   GO  
  213.   IF EXISTS(SELECT * FROM sys.foreign_keys WHERE object_id=OBJECT_ID(N'fk_orderdetailsproduct'AND parent_object_id=OBJECT_ID(N'[Orders].[OrderDetails]'))  
  214.   ALTER TABLE Orders.OrderDetails DROP CONSTRAINT fk_orderdetailsproduct  
  215.   GO  
  216.   ALTER TABLE Orders.OrderDetails WITH CHECK ADD CONSTRAINT fk_orderdetailsproduct FOREIGN KEY(ProductID) REFERENCES Products.Product(ProductID)