代码之家  ›  专栏  ›  技术社区  ›  msarchet

表Alter/Add中有空和无空的语法差异

  •  0
  • msarchet  · 技术社区  · 14 年前

    IF NOT EXISTS(Select * 
                    FROM INFORMATION_SCHEMA.COLUMNS 
                   WHERE TABLE_NAME = N'RXINFO' 
                     AND TABLE_SCHEMA = N'scriptassist' 
                     AND COLUMN_NAME = N'Price')
    BEGIN
    
      Alter Table [scriptassist].[RXINFO] Add [Price] FLOAT
      Print 'Price Field  nonexistant creating this field'
    
    END
    ELSE
    BEGIN
      If Not Exists(Select * 
                      From Information_Schema.Columns 
                     Where Table_Name = N'RXINFO' 
                       And Table_Schema = N'scriptassist' 
                       And Column_Name = N'Price'
                       And DATA_Type = N'FLOAT' 
                       AND IsNull(CHARACTER_MAXIMUM_LENGTH, 0) = 0)
      BEGIN
    
        Alter Table [scriptassist].[RXINFO] Alter Column Price FLOAT
        Print 'Price Field  needed type updating'
    
      END
    END
    

    是我目前正在做的,以确定是否需要更改列或将列添加到数据库中。然而,即使只需要在500K-750K行数据库中添加3-4列,其中表的宽度约为100列,我估计每列需要15-20分钟。

    我做了一些事情来加速它:

    • 单用户模式
    • 确保除了我的数据库没有其他连接

    我仍然觉得它不应该花那么长的时间,所以我的问题是我是否需要显式地添加 NULL 之后的列类型为这个工作的速度,我认为它应该?

    1 回复  |  直到 14 年前
        1
  •  0
  •   gbn    14 年前

    如果指定“NULL”或“NOT NULL WITH DEFAULT 0.0”,则只会更新架构,并且表中的行不会更改,因此每个表的更改时间都不超过1秒。

    如果列可以为null,那么它不必存在,因此不需要更新行 当你改变模式时

    如果该列在没有默认值的情况下不可为null,则当您更改架构以添加该列时,现有表中的每一行都将更新为添加默认值为0.0的列。这就是为什么你的改变需要几分钟。

    在这两种情况下,当前的INSERT/updatesql将在不做任何更改的情况下工作。如果您添加了一个没有默认值的“notnull”列,那么当前的updatesqls将会爆炸,除非您添加了price列。这可能是好事,也可能是坏事,这取决于你想要达到的目标。