MS SQL 建表SQL的脚本

数据库里新建一个表的方式比较多,

可以在对象资源管理器手动新建一个表,这样的建表方式比较方便、直观。

但是如果该表要在几个数据库(开发环境数据库,测试环境数据库、正式系统数据库等)里新建的话,这时反而不如用脚本处理,这样会方便得多。

尤其是在创建数据库时要新建上百个表时,那种手工建表方式想都不敢想。

这里主要讨论、收集使用脚本来新建表的写法。

如有不妥或不对的地方,希望大家多多指教,更正我的错误。

下面来看看第一种SQL写法

CREATE TABLE [Users]
(
    [UserID]                  INT IDENTITY(1,1)    ,--ID主键
    [UserName]                NCHAR(15)            ,--用户名
    [Password]                CHAR(15)             ,--密码
    [NickName]                NCHAR(15)            ,--别名、网名    
    [Name]                    NCHAR(8)             ,--真实姓名
    [SEX]                     BIT                  ,--性别
    [Age]                     SMALLINT             ,--年龄
    [Birthday]                SMALLDATETIME        ,--生日
    [Moblie]                  CHAR(11)             ,--手机
    [OfficePhone]             CHAR(12)             ,--办公室座机
    [HomePhone]               CHAR(12)             ,--家里座机
    [Email]                   NCHAR(30)            ,--电子邮件
    [QQ]                      CHAR(10)             ,--QQ
    [MSN]                     CHAR(20)             ,--MSN
    [Skype]                   CHAR(25)             ,--Skype
    [PersonWebsit]            CHAR(20)             ,--个人主页
    [Schoole]                 NCHAR(20)            ,--毕业学校
    [Place]                   NCHAR(15)            ,--籍贯
    [Hometown]                NCHAR(25)            ,--家乡
    [CreateDate]              SMALLDATETIME        ,--用户创建时间
    [UpdateDate]              SMALLDATETIME        ,--用户资料更新时间
    [LastLogin]               SMALLDATETIME        ,--用户最后登录时间
    [IP]                      CHAR(15)             ,--用户登录IP
    [Lock]                    BIT                  ,--用户是否被锁定
    [IsAdmin]                 BIT                  ,--是否是管理员
    [Session]                 CHAR(20)             ,--保存登录Seesion
    CONSTRAINT PK_Users_UserID PRIMARY KEY(UserID)    
)
View Code

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

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

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

USE MyAssistant
GO

IF EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME = 'Users' AND XTYPE ='U') 
DROP TABLE Users;

CREATE TABLE [Users]
(
    [UserID]                  INT IDENTITY(1,1)    ,--ID主键
    [UserName]                NCHAR(15)            ,--用户名
    [Password]                CHAR(15)             ,--密码
    [NickName]                NCHAR(15)            ,--别名、网名    
    [Name]                    NCHAR(8)             ,--真实姓名
    [SEX]                     BIT                  ,--性别
    [Age]                     SMALLINT             ,--年龄
    [Birthday]                SMALLDATETIME        ,--生日
    [Moblie]                  CHAR(11)             ,--手机
    [OfficePhone]             CHAR(12)             ,--办公室座机
    [HomePhone]               CHAR(12)             ,--家里座机
    [Email]                   NCHAR(30)            ,--电子邮件
    [QQ]                      CHAR(10)             ,--QQ
    [MSN]                     CHAR(20)             ,--MSN
    [Skype]                   CHAR(25)             ,--Skype
    [PersonWebsit]            CHAR(20)             ,--个人主页
    [Schoole]                 NCHAR(20)            ,--毕业学校
    [Place]                   NCHAR(15)            ,--籍贯
    [Hometown]                NCHAR(25)            ,--家乡
    [CreateDate]              SMALLDATETIME        ,--用户创建时间
    [UpdateDate]              SMALLDATETIME        ,--用户资料更新时间
    [LastLogin]               SMALLDATETIME        ,--用户最后登录时间
    [IP]                      CHAR(15)             ,--用户登录IP
    [Lock]                    BIT                  ,--用户是否被锁定
    [IsAdmin]                 BIT                  ,--是否是管理员
    [Session]                 CHAR(20)             ,--保存登录Seesion
    CONSTRAINT PK_Users_UserID PRIMARY KEY(UserID)    
)
View Code

这这种写法也有个问题,就是DROP TABLE UserContactPerson; 这个地方,

一般来说不建议删除表后,然后新建,除非是数据库创建时,新建表。

原因不用多说,想必大家都很明白。

一般应该给予提示,让执行这段脚本的人去选择处理,类似于下面的写法

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

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

IF NOT EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME = 'UserContactPerson' AND XTYPE ='U')  
IF EXISTS( SELECT 1 FROM dbo.sysobjects  WHERE id = object_id(N'[dbo].[UserContactPerson]') and OBJECTPROPERTY(id, N'IsTable') = 1)
IF OBJECT_ID(N'UserContactPerson') IS NOT NULL
View Code
posted @ 2018-04-21 10:12  落霞秋水  阅读(362)  评论(0编辑  收藏  举报