我对T-SQL有点新意,来自MySQL背景我仍在适应语法中的不同细微差别。
我希望在特定的列之后添加一个新列。我发现AFTER
是一个有效的关键字,但我认为这不适合这项工作。
ALTER TABLE [dbo].[InvStockStatus]
ADD [Abbreviation] [nvarchar](32) DEFAULT '' NOT NULL ;
这是我当前的查询,效果很好,除了它在表的末尾添加字段,我更喜欢在 [Name]
之后添加。我正在寻找代表这个的语法是什么?
答案 0 :(得分:23)
你不能那样做
例如,如果您有这样的表
create table TestTable(id1 int,id3 int)
并且你想在id1和id3之间添加另一个列id2,那么如果你使用设计器,这就是SQL Server在幕后的作用
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_TestTable
(
id1 int NULL,
id2 int NULL,
id3 int NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_TestTable SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.TestTable)
EXEC('INSERT INTO dbo.Tmp_TestTable (id1, id3)
SELECT id1, id3 FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.TestTable
GO
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT'
GO
COMMIT
正如您所看到的,如果您有大量数据,这可能会有问题,为什么列位于何处?只需使用
select col1,col2,col3 from table
答案 1 :(得分:6)
从功能数据库的角度来看,元组可以按任何顺序出现是正确的。
但真空中不存在数据库。总有一个人会想要读取表模式(dbas,devs)并绕过它并维护或编写查询。
过去,我使用了表的列的约定,例如用
命令表这些在扫描表格时有所帮助。不幸的是,你似乎必须通过箍来维持任何秩序,所以现在我不得不质疑它是否值得拥有和维护这些约定。我的新规则只是将它添加到最后。
如果您从可读性的角度真的担心订单,那么您应该按照您想要的任何顺序创建自己的“可读性”视图(可能在不同的模式中)。您可以拥有同一个表的多个视图(一个用于核心列,另一个包含通常不相关的东西)。
能够在SQL Server数据库图表中重新排序列(仅作为显示内容)会很高兴,但这是不可能的。
答案 2 :(得分:5)
在任何RDBMS中,列的顺序与严格(功能)意义上的确无关 - 它只是文档或人类可以看到的“精确”。
SQL Server不支持任何T-SQL命令以任何方式对列进行排序。因此,T-SQL中没有语法来实现这一目标。
改变它的唯一方法是在SSMS中使用可视表设计器,当您在列中移动列或在表中间插入列时,它实际上从头开始重新创建整个表。
答案 3 :(得分:2)
我见过的模式比较工具将创建一个具有所需排序的新表,然后将旧表中的数据复制到新表(使用一些重命名魔法使新表类似于旧表)。鉴于这种方法有多么简单,我认为没有T-SQL语句可以在特定位置添加新列。
答案 4 :(得分:2)
您应该始终仅在最后添加字段。您应该按所需顺序选择字段,但不要重新构建现有表以在中间添加列。这可能会破坏一些东西(人们做了一些愚蠢的事情,比如select *或者插入而没有指定人们不应该做那些事情的列,但他们确实这样做了。)
重新创建表可能是一个耗时很长的过程,无论如何都不会获得任何好处,并且可能会导致大量用户投诉和锁定。
答案 5 :(得分:1)
从技术上讲,或者我应该说,在学术上,列添加到表中的顺序,或者它们存储在数据库的内部存储模型中的顺序,对您来说不应该是任何问题。您可以简单地列出SQL查询的Select子句中的列,以控制列或计算表达式在您运行的任何查询的输出中出现的顺序。在内部,数据库可以任意方式存储实际数据以优化存储,或者帮助将数据元素与磁盘和/或内存边界对齐。
答案 6 :(得分:1)
这是一个安全解决方法,不使用临时表。将列添加到最后,只需转到SQL Sever Management Studio。点击表格,选择 - >设计(或修改)并将最后一列拖到您想要的位置。
这样您就不必担心丢失数据和索引。唯一的另一种选择是重新创建表,如果您有大量数据,这可能会有问题。
这个答案是为了帮助其他人而不是被接受作为答案。
答案 7 :(得分:0)
自发布此问题以来已经过了相当长的时间,但值得注意的是,以特定顺序放置列的基础原始SQL代码并未改变生成脚本的过程如果您选择在Visual Studio中使用SQL Server数据工具来管理数据库,则需要注意这一点。您部署到的数据库将始终具有您在项目中指定的顺序列。