【问题标题】:a special case when modifing the database修改数据库时的特殊情况
【发布时间】:2010-11-25 08:36:56
【问题描述】:

有时我在数据库设计中遇到以下情况,我想知道处理这种情况的最佳实践是什么:::

例如,我有一个特定的表,一段时间后,当数据库正在运行并且已经输入了一些真实数据时..我需要添加一些必填字段(应该不接受 null)..

在这种情况下最好的做法是什么..

使该字段接受 null 作为(表中已经输入了一些数据,并消除了重要的约束)并尝试通过代码中的一些验证来强制用户输入该字段..

截断所有输入的数据并重新输入(繁琐的工作)..

关于此问题的任何其他建议...

【问题讨论】:

  • 不需要截断表格并重新输入!?!?!
  • 非常感谢,我现在只是把场景写在我的脑海里,如果有更多的建议,那就太好了,我只是想知道在这种情况下的最佳实践是专业的,并且不破坏数据库设计的任何规则或约束......
  • @user418343。行。请注意我对 dportas 和 kevchadders 的回答的 cmets。没有用我重复其他人已经说过的话。

标签: sql sql-server database sql-server-2008 database-design


【解决方案1】:

这取决于要求。如果为新列填充现有行的数据不能立即使用,那么我通常更愿意创建一个新表并在数据存在时填充新行。如果并且当您拥有每一行的所有数据时,则将新列放入原始表中。

【讨论】:

  • 这是唯一正确的“最佳实践”答案。需要明确的是,新表将只有两列:旧表的 PK;和新列。关系是 1::0-1。
【解决方案2】:

如果可能的话,我会为新列设置一个默认值。

例如对于varchar

alter table table_name 
    add column_name varchar(10) not null 
    constraint column_name_default default ('Test') 

更新后,您可以删除默认值

alter table table_name 
drop constraint column_name_default

很多事情都会归结为您的要求。

【讨论】:

  • 1.答案在意图上是正确的,第二好的方法。它保留单个表,并将已知值加载到现有行(没有值)的新列中。 2. 请将“DF_Default_Object_Name”更改为“column_name_default”。 3. 编辑错误:你必须重新创建表(通过Alter)来删除Nullability,否则将保持不变,包含Nulls(更改适用于新行,而不是现有行)。
【解决方案3】:

这取决于您的应用程序、您的数据库方案、您的实体。

【讨论】:

  • 真的吗?其他人设法提供了一个股票或最佳实践答案。
【解决方案4】:

解决这个问题的最佳方法是截断数据并重新输入,但不需要太繁琐。临时表和表变量可以帮助解决这个问题。想到一个简单的程序来解决它:

  1. 在 SQL Server Management Studio 中,右键单击要修改的表并选择 Script Table As > CREATE To > New Query Editor Window

  2. CREATE语句的表名前添加#

  3. 将所有记录移动到临时表中,使用以下效果:

    INSERT INTO #temp SELECT * FROM original

  4. 然后运行脚本将所有记录保存到临时表中。

  5. 截断原始表,并进行必要的更改。

  6. 1234563 /p>

就是这样。诚然,这不是很简单,但一个保存完好的数据库几乎总是值得一点点麻烦。

【讨论】:

  • @Ioannis:我很好奇你为什么愿意麻烦这么多。为什么不直接创建新列然后填充它?截断整个表格似乎没有必要而且很激烈。这意味着数据库(或至少此表)必须在更长的时间内不使用,而没有明显的好处。
  • 我不会。我认为 NOT NULL 字段在大多数情况下没有多大意义。相反,默认值提供了更大的灵活性。但是,在某些情况下确实如此,因此请执行上述步骤。
  • @Ioannis:1. 完全不可扩展。 2. Truncate & r-entry 是完全搞笑和不必要的。 3. 您还没有回答基本问题,即对于现有行,将什么加载到新列中?
  • @PerformanceDBA: 1. 请解释一下。 2. 正如我所提到的,不是每天都要做的事情,但仍然很有用。除非在处理喜剧时,否则将某事定性为“搞笑”是不具建设性的。 3. 这不是基本问题。这个问题是负责决定让该字段不能接受null的人解释的,这里显然应该填空。
  • 您不需要通过这些步骤来创建非空列,我不建议这样做。 “我认为 NOT NULL 字段在大多数情况下没有多大意义。”好家伙!我认为您在这句话中遗漏了一些重要的警告和解释。
猜你喜欢
  • 2010-09-25
  • 2016-10-23
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多