【问题标题】:Create Table if not exists without columns如果没有列,则创建表
【发布时间】:2013-09-21 05:26:51
【问题描述】:

是否可以只在 MSSQL 中创建没有列的表?

我问这个是因为我必须检查每一列是否已经存在。

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tags]') AND type in (N'U'))
    BEGIN
        CREATE TABLE [dbo].Tags(
        [Id] [int] IDENTITY(1,1) NOT NULL,
         CONSTRAINT [PK_Tags] PRIMARY KEY CLUSTERED 
        (
            [Id] ASC
        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
        ) ON [PRIMARY]
    END
GO

如果表和列已存在,则创建列 Id 可能会中断执行。

理想情况下:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tags]') AND type in (N'U'))
CREATE TABLE [dbo].Tags
GO

if NOT EXISTS (select column_name from INFORMATION_SCHEMA.columns where table_name = 'Tags' and column_name = 'Id')
  alter table MyTable add MyColumn int IDENTITY(1,1) NOT NULL
GO

-- add new primary key constraint on new column   
ALTER TABLE dbo.Tags 
ADD CONSTRAINT PK_Tags
PRIMARY KEY CLUSTERED ([Id] ASC)
GO

我在第二段代码中找不到示例。但我可以想象不能用 0 列创建一个表。

有什么建议吗?

[编辑] 更多的上下文。有些表存在有些不存在。有些列存在有些不存在。我想创建一个可以随时执行的脚本,而不会破坏或导致错误消息,例如表/列已经存在。

【问题讨论】:

  • 不要编写即时创建表的代码?
  • 问题写得不好。应该有更多的细节。您是在寻找没有列的表,还是在列不存在的情况下在表上创建列?
  • 很遗憾,这是不可能的。 SQL 语言在很多地方都达不到您对真正基于 Set 的语言的期望(即空集很有趣,但 SQL 不允许表或键具有空列集)
  • 我编辑了我的帖子以获得更多背景信息。但是阅读回复,这是不可能的,对吧?

标签: sql sql-server sql-server-2012


【解决方案1】:

这段代码

create table tab

引发错误

'tab' 附近的语法不正确。

还有这段代码

 create table tab1
 (
   id int
 )

 alter table tab1 drop id

引发错误

ALTER TABLE 'tab1' 失败。删除表中的所有列不是 允许。

所以没有列的表是不可能的。

【讨论】:

    【解决方案2】:

    我认为您可以使用以下方法实现您正在尝试的目标:

    使用 ID 创建表,如果您不必创建表,则仅检查 Id 列是否存在。

    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tags]') AND type in (N'U'))
    BEGIN 
        CREATE TABLE [dbo].Tags (Id int IDENTITY(1,1) NOT NULL)
    END
    ELSE
    BEGIN
        if NOT EXISTS (select column_name from INFORMATION_SCHEMA.columns where table_name = 'Tags' and column_name = 'Id')
        BEGIN
            alter table [dbo].Tags add MyColumn int IDENTITY(1,1) NOT NULL
    
            -- add new primary key constraint on new column   
            ALTER TABLE dbo.Tags 
            ADD CONSTRAINT PK_Tags
            PRIMARY KEY CLUSTERED ([Id] ASC)
        END
    ELSE
    
    GO
    

    【讨论】:

      【解决方案3】:

      当然你不能在SQL Server中创建没有列的表,但是如果表在你创建之前不存在,那么它就没有任何列,那你为什么不简单地创建它呢?

      如果这是一种升级脚本,您可以创建一个 ELSE 分支,在添加之前检查每一列。

      【讨论】:

      • “当然”可能有点强。在关系理论(SQL 本来打算遵循的)中,没有属性的关系仍然很有趣。 (例如,不包含属性的键,这意味着只能包含 0 或 1 个元组的关系)
      • 我知道,但是由于这个问题被标记为 [sql-server] 我不想混淆海报 ;-) 现在我添加了“在 SQL Server 中”...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多