|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引不是万能的,索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。之前一向觉得在SQLSERVER中,在表的列两头拔出新列与在表的最初面增加一列,这二者应当是一样的。明天特地为这二者做了对照,剖析以下:
我们先创立一个复杂的表,用来做剖析:
CREATETABLE[dbo].[Table_1](
[ID][int]IDENTITY(1,1)NOTNULL,
[Name][varchar](50)COLLATEChinese_PRC_CI_ASNULL
)ON[PRIMARY]
然后在MicrosoftSQLServerManagementStudio中在该表的ID列与Name列中拔出varchar(50)列UserID,然后点击天生变动剧本,天生的剧本以下:
/*为了避免任何大概呈现的数据丧失成绩,您应当先细心反省此剧本,然后再在数据库计划器的高低文以外运转此剧本。*/
BEGINTRANSACTION
SETQUOTED_IDENTIFIERON
SETARITHABORTON
SETNUMERIC_ROUNDABORTOFF
SETCONCAT_NULL_YIELDS_NULLON
SETANSI_NULLSON
SETANSI_PADDINGON
SETANSI_WARNINGSON
COMMIT
BEGINTRANSACTION
GO
CREATETABLEdbo.Tmp_Table_1
(
IDintNOTNULLIDENTITY(1,1),
UserIDvarchar(50)NULL,
Namevarchar(50)NULL
)ON[PRIMARY]
GO
SETIDENTITY_INSERTdbo.Tmp_Table_1ON
GO
IFEXISTS(SELECT*FROMdbo.Table_1)
EXEC(INSERTINTOdbo.Tmp_Table_1(ID,Name)
SELECTID,NameFROMdbo.Table_1WITH(HOLDLOCKTABLOCKX))
GO
SETIDENTITY_INSERTdbo.Tmp_Table_1OFF
GO
DROPTABLEdbo.Table_1
GO
EXECUTEsp_renameNdbo.Tmp_Table_1,NTable_1,OBJECT
GO
COMMIT
能够看出来,SQLSERVER是先将拔出后的列和原本的列一同创立了一个新的表Tmp_Table_1,然后设置IDENTITY_INSERT为on,即开启自增量显式拔出,再将Table_1的数据复制到Tmp_Table_1中,然后封闭自增量显式拔出,再然后删除dbo.Table_1,最初修正dbo.Tmp_Table_1表名为dbo._Table_1。
关于IDENTITY_INSERT的详细用法,请拜见本站:
往自增列拔出显式值-SETIDENTITY_INSERT详解
这个中触及的步骤良多,假如为该表创立了触发器,束缚等,情形就加倍庞大了,并且在数据转移的过程当中,简单形成数据毛病。
我们再测试间接在表的最初一列Name后追加varchar(50)列UserID,然后点击天生变动剧本,天生的剧本以下:
/*为了避免任何大概呈现的数据丧失成绩,您应当先细心反省此剧本,然后再在数据库计划器的高低文以外运转此剧本。*/
BEGINTRANSACTION
SETQUOTED_IDENTIFIERON
SETARITHABORTON
SETNUMERIC_ROUNDABORTOFF
SETCONCAT_NULL_YIELDS_NULLON
SETANSI_NULLSON
SETANSI_PADDINGON
SETANSI_WARNINGSON
COMMIT
BEGINTRANSACTION
GO
ALTERTABLEdbo.Table_1ADD
UserIDvarchar(50)NULL
GO
COMMIT
能够看出来,如许SQLSERVER实行的SQL十分复杂,间接就Alter表了,不会产生数据转移与创立一时表等情形,固然也不会形成数据转移毛病了。
以是,假如不是有出格的请求,在表中增加新列时,我们激烈保举间接在表尾增加,而不是在表两头拔出新的列。上面我们说了DML的闪回方案。但对于DDL却无能为力,对于大多数的DDL,即使是rowbase格式,二进制日志binlog中仍只记录语句本身。对于删表操作,只记录一个语句droptablet。仅凭这句话,无法还原表的数据。 |
|