2010-11-25 108 views
1

有时我在数据库设计面临以下情况下,数据库的时候,,我想知道什么是处理这种情况:::特殊情况对矫正

,比如我有一个特定的表的最佳实践和一段时间后,,当已经进入运行中的数据库和一些真实的数据。我需要添加一些必需的字段(即假定不接受空)..

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

使字段接受空如(表中已经输入了一些数据来看,并划破了重要的约束),并试图迫使用户通过在代码中一些验证进入这一领域..

截断所有输入数据,并再次重新输入他们(繁琐的工作)..

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

+1

截断表格并不需要重新输入!?!?! – PerformanceDBA 2010-11-25 11:37:57

+0

非常感谢,现在我只是把情景写在我脑海中,如果有更多的建议,这将是伟大的,我只是想知道在这种情况下最好的做法是专业,而不是违反任何规则或数据库设计的限制... – 2010-11-25 12:35:26

+0

@ user418343。好。请注意我对dportas'和kevchadders'答案的评论。不要用我重复其他人已经说过的话。 – PerformanceDBA 2010-11-25 16:46:28

回答

-1

去它的最好办法是截断的数据和重新 - 重新进入,但不必太繁琐的项目。临时表格和表格变量可以帮助解决这个问题。一个简单的程序想到去做:

  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. 右键 - 单击该表并选择Script Table As>INSERT To>Clipboard,将其粘贴到您的查询编辑器窗口,并修改它从临时表中读取记录,使用INSERT .. SELECT

就是这样。诚然,这不是很直接,但保存良好的数据库几乎总是值得一点点的麻烦。

1

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

例如用于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 

在很大程度上将归结为您的要求。

+0

1.答案在意图上是正确的,是第二好的方法。它保留单个表,并将已知值加载到现有行(没有值)的新列中。 2.请将“DF_Default_Object_Name”更改为“column_name_default”。 3.编辑错误:您必须重新创建表(通过更改)以移除可空性,否则将保持不变,包含空值(该更改适用于新行,而不是现有行)。 – PerformanceDBA 2010-11-25 11:54:34

0

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

+0

真的吗?其他人设法提供股票或最佳实践答案。 – PerformanceDBA 2010-11-25 15:21:03

2

这取决于要求。如果要填充新列的现有行的数据不能立即提供,那么我通常会更喜欢创建一个新表,并在数据存在时填充新行。如果并且每个行都有所有数据,则将新列放入原始表中。