zoukankan      html  css  js  c++  java
  • MS SQL 建表SQL的脚本

        数据库里新建一个表的方式比较多,可以在对象资源管理器手动新建一个表,这样的建表方式比较方便、直观。但是如果该表要在几个数据库(开发环境数据库,测试环境数据库、正式系统数据库等)里新建的话,这时反而不如用脚本处理,这样会方便得多。尤其是在创建数据库时要新建上百个表时,那种手工建表方式想都不敢想。这里主要讨论、收集使用脚本来新建表的写法。如有不妥或不对的地方,希望大家多多指教,更正我的错误。下面来看看第一种SQL写法

    Code Snippet
    1. CREATE TABLE UserContactPerson
    2. (
    3.    ID                    INT PRIMARY KEY,
    4.    UserID                INT               ,
    5.    ContactPersonID        INT
    6.     
    7. )

    这种写法是最原始、落后的。也是最容易产生错误的写法:

          首先有在代码里,它没有指定在那个数据库执行,有时候人很粗心,打开文件就执行了,有可能把表就建到master或其他数据库去了。

          其次在批处理建表的时候,如果这个表在该数据库已经存在了。则会影响执行。所以我们可以改善一下它的写法。

    Code Snippet
    1. USE MyAssistant
    2. GO
    3.  
    4.   IFEXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME = 'UserContactPerson' AND XTYPE = 'U')
    5.  
    6. DROP TABLE UserContactPerson;
    7. CREATE TABLE UserContactPerson
    8. (
    9.    ID                    INT PRIMARY KEY,
    10.    UserID                INT,
    11.    ContactPersonID        INT
    12.     
    13. )
    14. GO

    这这种写法也有个问题,就是DROP TABLE UserContactPerson; 这个地方,一般来说不建议删除表后,然后新建,除非是数据库创建时,新建表。原因不用多说,想必大家都很明白。一般应该给予提示,让执行这段脚本的人去选择处理,类似于下面的写法

       1: IF NOT EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME = 'Users' AND XTYPE ='U') 
       2:  
       3: CREATE TABLE [Users]
       4: (
       5:     [UserID]                  INT IDENTITY(1,1)    ,--ID主键
       6:     [UserName]                NCHAR(15)            ,--用户名
       7:     [Password]                CHAR(15)             ,--密码
       8:     [NickName]                NCHAR(15)            ,--别名、网名    
       9:     [Name]                    NCHAR(8)             ,--真实姓名
      10:     [SEX]                     BIT                  ,--性别
      11:     [Age]                     SMALLINT             ,--年龄
      12:     [Birthday]                SMALLDATETIME        ,--生日
      13:     [Moblie]                  CHAR(11)             ,--手机
      14:     [OfficePhone]             CHAR(12)             ,--办公室座机
      15:     [HomePhone]               CHAR(12)             ,--家里座机
      16:     [Email]                   NCHAR(30)            ,--电子邮件
      17:     [QQ]                      CHAR(10)             ,--QQ
      18:     [MSN]                     CHAR(20)             ,--MSN
      19:     [Skype]                   CHAR(25)             ,--Skype
      20:     [PersonWebsit]            CHAR(20)             ,--个人主页
      21:     [Schoole]                 NCHAR(20)            ,--毕业学校
      22:     [Place]                   NCHAR(15)            ,--籍贯
      23:     [Hometown]                NCHAR(25)            ,--家乡
      24:     [CreateDate]              SMALLDATETIME        ,--用户创建时间
      25:     [UpdateDate]              SMALLDATETIME        ,--用户资料更新时间
      26:     [LastLogin]               SMALLDATETIME        ,--用户最后登录时间
      27:     [IP]                      CHAR(15)             ,--用户登录IP
      28:     [Lock]                    BIT                  ,--用户是否被锁定
      29:     [IsAdmin]                 BIT                  ,--是否是管理员
      30:     [Session]                 CHAR(20)             ,--保存登录Seesion
      31:     CONSTRAINT PK_Users_UserID PRIMARY KEY(UserID)    
      32: )
      33: ELSE
      34:   --DROP TABLE Users
      35:   PRINT 'this table have been existed! you should check and take action'
      36: GO

    下面看看来判断该表是否存在的几种方法

       

    Code Snippet
    1. 1    IF NOT EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME = 'Users' AND XTYPE ='U')  
    2. 2   IF EXISTS( SELECT 1 FROM dbo.sysobjects  WHERE id = object_id(N'[dbo].[UserGroup]') and OBJECTPROPERTY(id, N'IsTable') = 1)
    3. 3   IF OBJECT_ID(N'ContactPerson') IS NOT NULL
    扫描上面二维码关注我
    如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/kerrycode/p/1556130.html
Copyright © 2011-2022 走看看