Bir sütunu nasıl değiştirebilir ve varsayılan değeri nasıl değiştirebilirim?


190

Bir sütunun veri türünü değiştirmeye çalışırken ve yeni bir varsayılan değer ayarlarken aşağıdaki hatayı aldım:

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

HATA 1064 (42000): SQL sözdiziminizde bir hata var; 1. satırda 'VARCHAR (255) NOT NULL SET DEFAULT' {} '' yakınında kullanılacak doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın


VARSAYILAN önce SET ihtiyacınız olduğunu sanmıyorum
Jonas T

Yanıtlar:


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

Aynı şeyi yapan ikinci bir olasılık (juergen_d sayesinde):

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

9
columnİsteğe bağlıdır. Sadece kullanabilirsiniz ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';ya ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';da sonuç aynı olacaktır.
kapad

1
OP'nin istediği varsayılan dizedir. Bir satır eklerken bu sütun için değer belirtmediğinizde değer olur {}.
fancyPants

1
Yan yana iki cols yazmak doğru mu? (Böyle col col)
Shafizadeh

4
@Shafizadeh Evet, öyle. Bu, bir sütunu yeniden adlandırma olanağı sağlar. Birincisi orijinal isim, ikincisi yeni isim.
fancyPants

3
Yalnızca DEFAULTdeğeri değiştirmeniz gerekirse bunu kullanmayın . Bu, tablonun tüm satırlarını hiçbir şey için işleyecektir (büyük tablolarda çok uzun). Bunun yerine ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>anında kullanın .
dolmen

114

Bir takip olarak, sadece bir varsayılan ayarlamak istiyorsanız, ALTER .. SET sözdizimini kullanabileceğinizden emin olabilirsiniz. Diğer tüm şeyleri oraya koymayın. Sütun tanımının geri kalanını koyacaksanız, kabul edilen yanıta göre DEĞİŞTİR veya DEĞİŞTİR sözdizimini kullanın.

Her neyse, bir sütun varsayılanı ayarlamak için ALTER sözdizimi, (çünkü buraya geldiğimde aradığım şey buydu):

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

Bunun için 'değişmez' bir sayı da olabilir (örneğin ...SET DEFAULT 0). Ben denemedim ...SET DEFAULT CURRENT_TIMESTAMPama neden olmasın?


5
Ayrıca current_timestamp alıntılanırsa benim için çalışmıyor. Aşağıdakileri kullanmak zorunda kaldım:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis

7
+1 Benim için en iyi cevap, bu nedenle sütunun türünü ve değişmeyecek diğer şeyleri belirtmem gerekmiyor!
user2342558

2
Bu sadece DEFAULTdeğeri değiştirmek için etkili bir cevaptır .
dolmen

1
Varsayılan değerin ekleme zamanı olmasını istiyorsanız NOW()veya current_timestamp()@Malaise @Nereis
BlueCacti

16

Önceden oluşturulmuş sütun için varsayılan değer eklemek istiyorsanız, bu benim için çalışır:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';

2
Bu, mevcut alan spesifikasyonunu kopyalamanız gerekmediği için en iyi yanıttır.
rjh

4

DEFAULT CURRENT_TIMESTAMP için:

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

Lütfen çift sütun adı bildirimini not edin

DEFAULT CURRENT_TIMESTAMP kaldırılıyor:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;

Neden çift sütun adları?
MKJ

2
ALTER TABLE tablename COLUME COLUMN'i değiştir oldColName newColName sütunuTanımlar
Leonard Lepadatu

1

Kabul edilen cevap iyi çalışıyor.

NULL değer hatasının geçersiz kullanımı durumunda, NULL değerlerde, tüm null değerleri bu sütundaki varsayılan değere güncelleyin ve sonra değiştirmeyi deneyin.

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

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

İhtiyacım olan şey. Teşekkürler
arslion

0

Yukarıdakilerin sizin için işe yaramaması durumunda (yani: yeni SQL veya Azure ile çalışıyorsanız ) aşağıdakileri deneyin:

1) mevcut sütun kısıtlamasını (varsa) bırakın:

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) yeni bir tane oluşturun:

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

0

Bunu dene

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

bunun gibi

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.