Benutzer mit den meisten Antworten
Tabellen Spallten ändern und/oder hinzufüügen.

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
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
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
-
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 -
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
-
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: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
-
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 -
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 -
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