Jak zmienić kolumnę i zmienić wartość domyślną?

190

Wystąpił następujący błąd podczas próby zmiany typu danych kolumny i ustawienia nowej wartości domyślnej:

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

BŁĄD 1064 (42000): Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, czy ma prawidłową składnię do użycia w pobliżu „VARCHAR (255) NOT NULL SET DEFAULT” {} ”w wierszu 1

qazwsx
źródło
Nie sądzę, żebyś potrzebował SET przed DOMYŚLNYM
Jonas T

Odpowiedzi:

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

Druga możliwość, która robi to samo (dzięki juergen_d):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';
wymyślne majtki
źródło
9
columnJest opcjonalne. Możesz po prostu użyć ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';lub, ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';a wynik będzie taki sam.
kapad
1
Jest to domyślny ciąg, o który prosi OP. Jeśli nie określisz żadnej wartości dla tej kolumny podczas wstawiania wiersza, wartość staje się {}.
fancyPants
1
Czy pisanie dwóch cols obok siebie jest poprawne? (jak to col col)
Shafizadeh
4
@Shafizadeh Tak, to prawda. Daje to możliwość zmiany nazwy kolumny. Pierwszy to oryginalna nazwa, drugi to nowa nazwa.
fancyPants
3
Nie używaj tego, jeśli chcesz zmienić tylko DEFAULTwartość. Spowoduje to przetworzenie wszystkich wierszy tabeli na nic (bardzo długie na dużych stołach). Użyj zamiast tego, ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>co jest natychmiastowe.
dolmen
114

W ramach kontynuacji, jeśli chcesz ustawić wartość domyślną, możesz być pewien, że możesz użyć składni ALTER .. SET. Po prostu nie umieszczaj tam wszystkich innych rzeczy. Jeśli chcesz wstawić resztę definicji kolumny, użyj składni MODIFY lub CHANGE zgodnie z przyjętą odpowiedzią.

W każdym razie, składnia ALTER służąca do ustawiania domyślnej kolumny (ponieważ tego właśnie szukałam, kiedy tu przyszłam):

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

Dla których „literał” może być również liczbą (np ...SET DEFAULT 0.). Nie próbowałem tego, ...SET DEFAULT CURRENT_TIMESTAMPale dlaczego nie?

DaveJenni
źródło
5
Również current_timestamp nie działał dla mnie, jeśli był cytowany. Musiałem zastosować następujące:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis
7
+1 Najlepsza odpowiedź dla mnie, dzięki temu nie muszę określać typu kolumny i innych rzeczy, które się nie zmienią!
user2342558,
2
Jest to skuteczna odpowiedź na zmianę tylko DEFAULTwartości.
dolmen
1
Jeśli chcesz, aby domyślną wartością był czas wstawiania, użyj NOW()lub current_timestamp()@Malaise @Nereis
BlueCacti
16

Jeśli chcesz dodać wartość domyślną do już utworzonej kolumny, działa to dla mnie:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';
Akash Dole
źródło
2
To najlepsza odpowiedź, ponieważ nie trzeba kopiować istniejącej specyfikacji pola.
rjh
4

W przypadku DOMYŚLNEJ 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;

Uwaga: deklaracja podwójnej nazwy kolumny

Usuwanie DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;
Leonard Lepadatu
źródło
Dlaczego podwójne nazwy kolumn?
MKJ
2
ALTER TABLE tablename CHANGE COLUMN oldColName newColName columnDefinicje
Leonard Lepadatu
1

Zaakceptowana odpowiedź działa dobrze.

W przypadku nieprawidłowego użycia błędu wartości NULL, włącz wartościach NULL zaktualizuj wszystkie wartości null do wartości domyślnej w tej kolumnie, a następnie spróbuj wykonać zmianę.

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

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';
Pradeep Kumar Prabaharan
źródło
Czego potrzebowałem. Dzięki
arslion
0

W przypadku, gdy powyższe nie działa dla Ciebie (tj .: pracujesz z nowym SQL lub Azure ), spróbuj wykonać następujące czynności:

1) usuń istniejące ograniczenie kolumny (jeśli istnieje):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) utwórz nowy:

ALTER TABLE [table_name] ADD CONSTRAINT DF_my_constraint  DEFAULT getdate() FOR column_name;
Mediolan
źródło
0

Spróbuj tego

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

lubię to

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
Sohail Ahmad
źródło