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) )
这种写法是最原始、落后的。也是最容易产生错误的写法:
首先有在代码里,它没有指定在那个数据库执行,有时候人很粗心,打开文件就执行了,有可能把表就建到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) )
这这种写法也有个问题,就是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
下面看看来判断该表是否存在的几种方法
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
一个自由.NET开发者
bingqiang1903@gmail.com
https://www.cnblogs.com/sunbingqiang/