2010-11-25 7 views
1

manchmal ich folgenden Fall in meiner Datenbank-Design Gesicht ,, ich will wissen, was die beste Praxis ist es, diesen Fall zu behandeln :::ein Sonderfall, wenn die Datenbank modifing

zum Beispiel i eine bestimmte Tabelle haben und Nach einer Weile ,, wenn die Datenbank in Betrieb und einige echte Daten sind bereits eingegeben .. Ich muss einige erforderliche Felder hinzufügen (die angeblich keine Null akzeptieren) ..

Was ist die beste Praxis in dieser Situation ..

Lassen Sie das Feld akzeptieren Null als (einige Daten bereits in der Tabelle eingegeben, und scarify die wichtige Einschränkung) und versuchen, den Benutzer zu erzwingen dieses Feld durch einige Validierung im Code ..

gestutzt alle eingegebenen Daten und neu eingegeben sie wieder (mühsame Arbeit) zu betreten ..

andere Vorschläge zu diesem Thema ...

+1

Abschneiden der Tabelle und Wiedereinstieg ist nicht erforderlich!?!?! – PerformanceDBA

+0

vielen dank, ich schreibe einfach die szenarien in meinen kopf, wenn es mehr vorschläge gibt, wird das großartig, ich will nur die beste praxis in diesem fall wissen, um professionell zu sein, und keine regel zu brechen oder Einschränkungen des Datenbankdesigns ... –

+0

@ user418343. OK. Beachten Sie meine Kommentare zu den Antworten von Dportas und Kevchadders. Ich benutze es nicht, das zu wiederholen, was andere bereits gesagt haben. – PerformanceDBA

Antwort

-1

Der beste Weg, um es zu tun ist, um die Daten zu kürzen und erneut eingeben, aber es muss nicht zu langweilig ein Element sein. Temporäre Tabellen und Tabellenvariablen können sehr hilfreich sein. Ein einfaches Verfahren kommt, darüber zu gehen in den Sinn:

  1. in dem SQL Server Management Studio, rechts - klicken Sie auf die Tabelle, die Sie und wählen Sie Script Table As>CREATE To>New Query Editor Window ändern möchten.

  2. Fügen Sie eine vor dem Tabellennamen in der CREATE Anweisung hinzu.

  3. Verschieben Sie alle Datensätze in die temporäre Tabelle, etwas in der Art der Verwendung:

    INSERT INTO #temp SELECT * FROM original

  4. Dann führen Sie das Skript alle Datensätze in die temporäre Tabelle zu halten.

  5. Kürzen Sie Ihre Originaltabelle und nehmen Sie alle erforderlichen Änderungen vor.

  6. Rechts - klicken Sie auf die Tabelle und wählen Sie Script Table As>INSERT To>Clipboard, es in Ihre Abfrage-Editor-Fenster einfügen und ändern Sie Datensätze aus der temporären Tabelle zu lesen, INSERT .. SELECT verwenden.

Das ist es. Zugegeben, nicht ganz unkompliziert, aber eine gepflegte Datenbank ist fast immer einen kleinen Aufwand wert.

+0

@Ioannis: Ich bin neugierig, warum du lieber so viel Ärger machen würdest. Warum nicht einfach die neue Spalte erstellen und dann ausfüllen? Das Abschneiden der gesamten Tabelle erscheint unnötig und drastisch. Es würde bedeuten, dass die Datenbank (oder zumindest diese Tabelle) für einen viel längeren Zeitraum ohne offensichtlichen Nutzen außer Betrieb sein musste. – sqlvogel

+0

würde ich nicht. Ich denke, dass NICHT-NULL-Felder in den meisten Szenarien keinen Sinn ergeben. Stattdessen bieten Standardwerte mehr Flexibilität. Es gibt jedoch einige Fälle, in denen sie dies tun, ergo die obigen Schritte. –

+0

@Ioannis: 1. Völlig unskalierbar. 2. Truncate & R-Entry ist völlig komisch und unnötig. 3. Sie haben die grundlegende Frage, die * für die vorhandenen Zeilen ist, nicht beantwortet, was in die neue Spalte geladen werden soll? * – PerformanceDBA

1

Wenn möglich Ich würde einen Standardwert für die neue Spalte festlegen.

z.B. Für Varchar

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

Nachdem Sie aktualisiert haben könnten Sie dann die

alter table table_name 
drop constraint column_name_default 

Viele Ihren Anforderungen Standard fallen wird fallen.

+0

1. Die Antwort ist in der Absicht richtig, die zweitbeste Methode. Es behält die einzelne Tabelle bei und lädt einen bekannten Wert in die neue Spalte für die vorhandenen Zeilen (die keinen Wert haben). 2. Bitte ändern Sie "DF_Default_Object_Name" in "column_name_default". 3. Der Edit ist falsch: Sie müssen die Tabelle neu erstellen (über Alter), um Nullability zu entfernen, andernfalls bleibt der Wert unverändert und enthält Nullwerte (die Änderung gilt für neue Zeilen, nicht für vorhandene Zeilen). – PerformanceDBA

0

Es hängt von Ihrer Anwendung, Ihrem Datenbankschema, Ihren Entitäten ab.

+0

Wirklich? Anderen ist es gelungen, eine Bestandsaufnahme oder eine Best-Practice-Antwort zu liefern. – PerformanceDBA

2

Es hängt von den Anforderungen ab. Wenn die Daten, die vorhandene Zeilen für die neue Spalte füllen sollen, nicht sofort verfügbar sind, würde ich im Allgemeinen eine neue Tabelle erstellen und nur neue Zeilen füllen, wenn die Daten vorhanden sind. Wenn Sie alle Daten für jede Zeile haben, fügen Sie die neue Spalte in die ursprüngliche Tabelle ein.

+1

Dies ist die einzig richtige, "best practice" Antwort. Um es klar zu sagen, die neue Tabelle wird nur zwei Spalten haben: die PK der alten Tabelle; und die neue Spalte. Die Beziehung ist 1 :: 0-1. – PerformanceDBA

Verwandte Themen