none
Tabellen Spallten ändern und/oder hinzufüügen. RRS feed

  • Frage

  • Hallo allerseits!

    Ich würde gerne wissen mit welchem SQL-Syntax ich folgendes Bewertställigen kann.

    Tabelle: Person (ID, Vn varchar [not null], NN varchar [not null], Adr varchar [not null], Alter varchar [null])
    hat mittelweile bsp. 5000 Zeilen.

    Jetzt würde ich gerne eine zusätzliche Spallte (BeschäftigtSeit datetime [not null]) in die Tabelle Person
    hinzufügen und zusätzlich "Allow Nulls" auf [not null] und den Daten-Typ der Spallte von
    varchar auf int ändern.

    Die Daten müssem dabei erhalten bleiben und bei der neuen Spallte kann auch ein Defaultwert eingetragen werden.
    Wäre sehr dankbar wenn mir jemand den Syntax dafür posten könnte.

    In diesem Sinne noch einen schönen Abend und

    Lg
    WaZZkeSS



    • Bearbeitet WaZZkeSS Freitag, 4. Januar 2013 21:55
    Freitag, 4. Januar 2013 21:28

Antworten

  • Hallo,

    wir reden hier über zwei Probleme

    1. Anpassen der Daten

    wenn Du über den von mir vorgeschlagenen Weg Umbenennen der alten Tabelle, anlegen einer neuen Tabelle mit gewünschter Struktur gehen willst. Dann musst Du alle NULL-Werte ersetzen

    z.B. update person set id = 0 where id  is null

    oder bei CHAR-Feldern update person set myfield = SPACE(0) where myfield  is null.

    Kompliziert wird es erst wenn Du den Datentyp ändern willst z.B. varchar auf int und in irgend einem DS befinden sich Werte die sich nicht in INT ändern lassen.

    2. Datenstruktur

    Nach meinem Verständnis erschlagen NOT NULL und DEFAULT-Wert zwei völlig unterschiedliche Probleme. Bei NOT NULL verweigert der Server den DS komplett. Wenn z.B. der DS nur über Ident-Nummern abgerufen wird, dann findet der Client den DS nie wieder wenn es möglich ist ohne Ident-Nummern zu speichern. Die Kombination NOT NULL und DEFAULT-Wert macht eigentlich keinen Sinn. DEFAULT-Werte kannst Du vorgeben.

    zb CREATE TABLE person (name CHAR(20) DEFAULT SPACE(0) ......)

    wie sinnvoll ein DEFAULT-Werte für ein datetime-Feld ist und welcher Wert es sein soll mussr Du entscheiden

    z.B. ALTER TABLE Person ADD BeschäftigtSeit datetime DEFAULT getdate()

    Guss Uli

    • Als Antwort markiert WaZZkeSS Samstag, 5. Januar 2013 18:43
    Samstag, 5. Januar 2013 15:27

Alle Antworten

  • Hallo WaZZkeSS,

    das hinzufügen einer Column ist kein Problem, in Deinem Fall

    ALTER TABLE Person ADD BeschäftigtSeit datetime not null

    Das Ändern der Eigenschaften von Columns wird mit dem Befehl

    ALTER TABLE <mytable> ALTER COLUMN <columnname>  .........

    vorgenommen. Hierzu gibt es aber jede Menge Einschränkungen. Sieh Dir am besten einmal die Online-Hilfe zu diesem Befehl an.

    Das ändern der Eigenschaft NULL auf NOT NULL geht meines Wissens nur über dem Umweg

    Umbenennen der Datei Person

    sp_rename @objname = 'person' , @newname = 'personold'

    Anlegen der neuen Datei Person

    CREATE TABLE person (.........)

    Übernahme der DS

    INSERT INTO person(...) SELECT .. FROM personold

    Gruss Uli


    • Bearbeitet Uli Münch Samstag, 5. Januar 2013 07:26
    Samstag, 5. Januar 2013 07:24
  • Hallo Uli,

    danke vorerst für die Antwort. Jedoch hätte ich noch offene Fragen welche sich daraus entwickelten. Ich gehe einfach von oben runter.
    das hinzufügen einer Column ist kein Problem, in Deinem Fall

    ALTER TABLE Person ADD BeschäftigtSeit datetime not null

    ... danke aber geht nur wenn man "Allow Nulls" auf NULL stellt. Wie kann man hier einen Defaultwert gleich mit angeben angeben ohne
    im nachhinein mit einem INSERT, falls das geht???


    ALTER TABLE <mytable> ALTER COLUMN <columnname>  .........

    vorgenommen. Hierzu gibt es aber jede Menge Einschränkungen. Sieh Dir am besten einmal die Online-Hilfe zu diesem Befehl an.

    funktioniert gut für Daten-Typen. Obwohl auch hier "Allow Nulls" angegeben werden kann ist als Voraussetzung das keine Spalten leer ist.
    Aber auch hier stellt sich die Frage ob es Möglich ist beim ändern von "Allow Nulls" Eigenschaft, Spalten welche leer sind autom. mit
    einem Defaultwert zu versorgen.


    Das ändern der Eigenschaft NULL auf NOT NULL geht meines Wissens nur über dem Umweg

    Umbenennen der Datei Person

    sp_rename @objname = 'person' , @newname = 'personold'

    Anlegen der neuen Datei Person

    CREATE TABLE person (.........)

    Übernahme der DS

    INSERT INTO person(...) SELECT .. FROM personold

    Verstehe ich nicht ganz.
    Wenn ich zuerst eine Sicherung daraus erstelle, danach die Tabelle neu erstelle mit der neuen "Allow Nulls" Eigenschaft auf NOT NULL.
    Muss ich ja auch einen Default wert angeben damit der Import funktioniert. Es kann ja sein das bei der Sicherung manche Felder leer sind.


    Sonst vielen Dank nochmals und

    Lg
    WaZZKess
    Samstag, 5. Januar 2013 10:58
  • Hallo,

    wir reden hier über zwei Probleme

    1. Anpassen der Daten

    wenn Du über den von mir vorgeschlagenen Weg Umbenennen der alten Tabelle, anlegen einer neuen Tabelle mit gewünschter Struktur gehen willst. Dann musst Du alle NULL-Werte ersetzen

    z.B. update person set id = 0 where id  is null

    oder bei CHAR-Feldern update person set myfield = SPACE(0) where myfield  is null.

    Kompliziert wird es erst wenn Du den Datentyp ändern willst z.B. varchar auf int und in irgend einem DS befinden sich Werte die sich nicht in INT ändern lassen.

    2. Datenstruktur

    Nach meinem Verständnis erschlagen NOT NULL und DEFAULT-Wert zwei völlig unterschiedliche Probleme. Bei NOT NULL verweigert der Server den DS komplett. Wenn z.B. der DS nur über Ident-Nummern abgerufen wird, dann findet der Client den DS nie wieder wenn es möglich ist ohne Ident-Nummern zu speichern. Die Kombination NOT NULL und DEFAULT-Wert macht eigentlich keinen Sinn. DEFAULT-Werte kannst Du vorgeben.

    zb CREATE TABLE person (name CHAR(20) DEFAULT SPACE(0) ......)

    wie sinnvoll ein DEFAULT-Werte für ein datetime-Feld ist und welcher Wert es sein soll mussr Du entscheiden

    z.B. ALTER TABLE Person ADD BeschäftigtSeit datetime DEFAULT getdate()

    Guss Uli

    • Als Antwort markiert WaZZkeSS Samstag, 5. Januar 2013 18:43
    Samstag, 5. Januar 2013 15:27
  • Hallo Du unausprechlicher,
    wenn Du das SQL Management Studio startest, die Tabelle editierst kommt die Option ein Script zu erzeugen. Das enthält die SQL's die deiner Mausklickerei entsprechen.
    Hier ein etwas zum lesen:

    http://stackoverflow.com/questions/2431901/forcing-management-studio-to-use-alter-table-instead-of-drop-create

    Der ist nützliche beim umbenennen von Spalten:
    http://blog.sqlauthority.com/2009/05/18/sql-server-fix-management-studio-error-saving-changes-in-not-permitted-the-changes-you-have-made-require-the-following-tables-to-be-dropped-and-re-created-you-have-either-made-changes-to-a-tab/

    Grüße Alexander

    Samstag, 5. Januar 2013 18:39
  • Hall Uli,

    danke für die Antwort. Das habe ich mir auch gedacht.
    [quote]
    wie sinnvoll ein DEFAULT-Werte für ein datetime-Feld ist und welcher Wert es sein soll mussr Du entscheiden
    [/quote]
    Dies war nur ein Beispiel das ich gerade diese Spalte als bsp genommen hab.

    Jedenfalls ist mir das jetzt klarer und bedanke mich recht herzlichst für deine
    Antworten und wünsche dir noch einen schönen Abend und

    Lg
    WaZZkeSS

    Samstag, 5. Januar 2013 18:43
  • Hallo Du unausprechlicher,

    Wenn dieser Name unaussprechlich ist wie kommst du den mit den ganzen SQL-Statements und den Promrammiercode den du Schreibst zu recht.

    Scherzkeks, jedenfalls danke für deinen Beitrag aber vielleicht kannst du solche Andeutungen in Zukunft unterlassen.

    Lg
    WaZZkeSS

    Samstag, 5. Januar 2013 22:37
  • Nun zunächst einmal ist der Name für mich unaussprechlich. Es ist keine Andeutung dabei sondern einfach nur der Name ist für mich unaussprechlich.
    Wenn Du der Meinung bist ich sei Dir auf den Schlips getreten so war das nicht in meiner Absicht. Und das ist kein Scheiss, das ist es sicher nicht.

    Grüße Alexander

    Sonntag, 6. Januar 2013 14:49