Wie ändere ich eine Spalte und ändere den Standardwert?

189

Beim Versuch, den Datentyp einer Spalte zu ändern und einen neuen Standardwert festzulegen, wurde folgende Fehlermeldung angezeigt:

ALTER TABLE foobar_data ALTER COLUMN col VARCHAR(255) NOT NULL SET DEFAULT '{}';

FEHLER 1064 (42000): In Ihrer SQL-Syntax ist ein Fehler aufgetreten. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für 'VARCHAR (255) NOT NULL SET DEFAULT' {} '' in Zeile 1

qazwsx
quelle
Ich glaube nicht, dass Sie SET vor DEFAULT brauchen
Jonas T

Antworten:

273
ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

Eine zweite Möglichkeit, die dasselbe tut (danke an juergen_d):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';
schicke Hose
quelle
9
Das columnist optional. Sie könnten einfach ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';oder verwenden ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';und das Ergebnis wird das gleiche sein.
Kapad
1
Dies ist die Standardzeichenfolge, nach der das OP gefragt hat. Wenn Sie beim Einfügen einer Zeile keinen Wert für diese Spalte angeben, wird der Wert {}.
FancyPants
1
Ist es colrichtig , zwei s nebeneinander zu schreiben ? (so col col)
Shafizadeh
4
@Shafizadeh Ja, das ist es. Dies bietet die Möglichkeit, eine Spalte umzubenennen. Der erste ist der ursprüngliche Name, der zweite ist der neue Name.
FancyPants
3
Verwenden Sie dies nicht, wenn Sie nur den DEFAULTWert ändern müssen . Dadurch werden alle Zeilen der Tabelle umsonst verarbeitet (bei großen Tabellen sehr lang). Verwenden Sie stattdessen, ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>was sofort ist.
Dolmen
113

Wenn Sie im Nachhinein nur einen Standard festlegen möchten, können Sie mit ziemlicher Sicherheit die Syntax ALTER .. SET verwenden. Steck einfach nicht all die anderen Sachen da rein. Wenn Sie den Rest der Spaltendefinition einfügen möchten, verwenden Sie die Syntax MODIFY oder CHANGE gemäß der akzeptierten Antwort.

Wie auch immer, die ALTER-Syntax zum Festlegen eines Spaltenstandards (da ich danach gesucht habe, als ich hierher kam):

ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT 'literal';

Für welches 'Literal' könnte auch eine Zahl sein (zB ...SET DEFAULT 0). Ich habe es nicht ausprobiert, ...SET DEFAULT CURRENT_TIMESTAMPaber warum nicht?

DaveJenni
quelle
5
Auch current_timestamp funktionierte bei mir nicht, wenn es zitiert wurde. Ich musste folgendes verwenden:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis
7
+1 Beste Antwort für mich, da ich auf diese Weise den Spaltentyp und andere Dinge, die sich nicht ändern, nicht angeben muss!
user2342558
2
Dies ist die effiziente Antwort, um nur den DEFAULTWert zu ändern .
Dolmen
1
Wenn Sie möchten, dass der Standardwert die Zeit des Einfügens ist, verwenden Sie NOW()oder current_timestamp()@Malaise @Nereis
BlueCacti
16

Wenn Sie einen Standardwert für eine bereits erstellte Spalte hinzufügen möchten, funktioniert dies für mich:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';
Akash Dole
quelle
2
Dies ist die beste Antwort, da Sie die vorhandene Feldspezifikation nicht kopieren müssen.
rjh
4

Für DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 CHANGE COLUMN columnname1 columname1 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 CHANGE COLUMN columnname2 columname2 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Bitte beachten Sie die doppelte Spaltennamendeklaration

DEFAULT CURRENT_TIMESTAMP entfernen:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;
Leonard Lepadatu
quelle
Warum doppelte Spaltennamen?
MKJ
2
ALTER TABLE Tabellenname CHANGE COLUMN oldColName newColName columnDefinitions
Leonard Lepadatu
1

Akzeptierte Antwort funktioniert gut.

Bei ungültiger Verwendung des NULL- Wertfehlers aktualisieren Sie bei NULL- Werten alle Nullwerte auf den Standardwert in dieser Spalte und versuchen Sie dann, die Änderung vorzunehmen.

UPDATE foobar_data SET col = '{}' WHERE col IS NULL;

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';
Pradeep Kumar Prabaharan
quelle
Was ich brauchte. Danke
arslion
0

Falls das oben genannte für Sie nicht funktioniert (dh Sie arbeiten mit neuem SQL oder Azure ), versuchen Sie Folgendes:

1) Löschen Sie die vorhandene Spaltenbeschränkung (falls vorhanden):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) Erstellen Sie eine neue:

ALTER TABLE [table_name] ADD CONSTRAINT DF_my_constraint  DEFAULT getdate() FOR column_name;
Mailand
quelle
0

Versuche dies

ALTER TABLE `table_name` CHANGE `column_name` `column_name` data_type  NULL DEFAULT '';

so was

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
Sohail Ahmad
quelle