我有3个列(column1,column2,column3)的表结构,我想用sql语句添加另一个列,如:
alter table tbl_name add column4
但我需要把它放在column1和column2之间
我可以在MYSQL中做一些事情:
alter table tbl_name add column4 after column1
答案 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
似乎没有办法简单地添加列。另外,要注意事务,这将删除原始表,因此最好使用事务