将列添加到现有SQL Server表 - 含义

时间:2013-08-12 13:40:55

标签: c# asp.net sql sql-server

我在SQL Server中有一个现有表,其中包含现有条目(事实上超过100万)。

此表由前端应用程序定期更新,插入和选择。我想/需要添加datetime列,例如M_DateModified可以像这样更新:

UPDATE Table SET M_DateModified = GETDATE()

每当在前端按下按钮并调用存储过程时。此列将按要求添加到现有报告中。

我的问题,答案就是这个。作为我们应用程序的核心表之一,ALTERING表格并添加其他列会破坏其他现有查询吗?显然,如果没有为所有列指定所有值,就无法插入到表中,因此任何现有的INSERT查询都会中断(WHICH是一个大问题)。

对于此问题的最佳解决方案,我们将非常感谢任何帮助。

4 个答案:

答案 0 :(得分:6)

首先,正如marc_s所说,它应该只影响SELECT *个查询,甚至不会影响所有查询。

其次,您只需要在INSERT上指定所有非Null 字段,因此如果您将其设为NULL,则无需担心。此外,对于Created_Date类型的列,通常会添加DEFAULT =GetDate()设置,如果未指定,则会为您填写。

第三,如果您仍然担心影响现有的代码库,请执行以下操作:

  1. 将您的表重命名为“physicalTable”。
  2. 创建一个与您的表格所具有的名称相同的视图,即SELECT .. FROM physicalTable,以明确的顺序列出列,但不包含M_DateModified字段。< / LI>
  3. 保持您的代码不被修改,现在引用View,而不是直接访问该表。
  4. 现在您的代码可以安全地与表进行交互而无需任何更改(SQL DML代码无法区分Table和可写的View之间的区别)。

    最后,这种“ModifiedDate”列是一个常见的需求,并且最常处理,首先使其为NULL,然后添加一个Insert&amp;更新自动设置的触发器:

    UPDATE t
    SET    M_DateModified = GetDate()
    FROM   (SELECT * FROM physicalTable y JOIN inserted i ON y.PkId = i.PkId) As t
    

    这样,应用程序不必维护字段本身。作为额外的好处,应用程序也不能错误地或错误地设置它(这是SQL中触发器的常见和可接受的使用)。

答案 1 :(得分:1)

如果新专栏不是强制性的,那么您无需担心。除非你有一些傻瓜用“*”而不是列表编写select语句。

答案 2 :(得分:1)

好吧,只要你的SELECT不是*,那些应该没问题。对于INSERT,如果您为该字段指定默认值GETDATE()并允许NULL,则可以将其排除,但仍然会被填充。

答案 3 :(得分:1)

取决于您的其他查询的设置方式。如果他们是SELECT [Item1], [Item2], ect ....那么你就不会遇到任何问题。如果它是SELECT * FROM,那么您可能会遇到一些意想不到的结果。

请记住您想要如何设置它,您必须将其设置为可以为空,这可能会让您适应未来,或设置默认日期,这可能会为您提供不正确的报告数据,检索,查询等。