在column1之前添加column2

时间:2009-07-19 14:48:27

标签: sql sql-server-2005

我有3个列(column1,column2,column3)的表结构,我想用sql语句添加另一个列,如:

alter table tbl_name add column4 

但我需要把它放在column1和column2之间

我可以在MYSQL中做一些事情:

alter table tbl_name add column4 after column1

4 个答案:

答案 0 :(得分:1)

我认为SQL Server不允许你做任何类似的事情。如果要在中间放置一列,则需要创建具有所需布局的新表,迁移数据,删除旧表,并重命名新表。

答案 1 :(得分:1)

@bdukes是对的。这基本上是SSMS在除了表的最后位置之外的任何位置添加列时所执行的操作。但是,您可以使用视图实现类似的功能。也就是说,只需将列添加到表的末尾,然后创建一个具有不同顺序列的视图。使用视图而不是实际表。我只提供这个作为在某些情况下有用的替代方案。我不一定会根据你的情况推荐它。通常,我在SSMS中使用设计器,并且在插入列时更新表没有任何问题。当然,备份是你的朋友!

答案 2 :(得分:1)

一个更基本的问题是你想要这样做的原因?除了SQL Enterprise管理器中的默认列显示之外,列的顺序无关紧要。您可以按照您想要的任何方式对SQL查询输出的列进行排序,无论列在数据库中如何“本地”排序。

事实上,从学术角度来看,RDBMS“关系”(表的学术名称)的一个基本属性是关系的“属性”(列)是无序的。

这并不是说想要'默认'顺序是某种方式是不够的理由......我经常删除并重新创建表格正是出于这个原因...但只是明白订单并不重要其他任何事情。

答案 3 :(得分:1)

在sql server 2005中,您可以保存表更改的更改脚本,因此例如我使用col1,col2和col3创建了一个测试表。然后在col1和col2之间添加col4。我保存了更改脚本,这就是它生成的内容。

看看

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_zzzzzzzz
    (
    col1 nchar(10) NULL,
    col4 nchar(10) NULL,
    col2 nchar(10) NULL,
    col3 nchar(10) NULL
    )  ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.zzzzzzzz)
     EXEC('INSERT INTO dbo.Tmp_zzzzzzzz (col1, col2, col3)
        SELECT col1, col2, col3 FROM dbo.zzzzzzzz WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.zzzzzzzz
GO
EXECUTE sp_rename N'dbo.Tmp_zzzzzzzz', N'zzzzzzzz', 'OBJECT' 
GO
COMMIT

似乎没有办法简单地添加列。另外,要注意事务,这将删除原始表,因此最好使用事务