Bagaimana cara mengubah kolom dan mengubah nilai default?

190

Saya mendapat kesalahan berikut saat mencoba mengubah tipe data kolom dan menetapkan nilai default baru:

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

GALAT 1064 (42000): Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'VARCHAR (255) JANGAN NULL SET DEFAULT' {} '' di baris 1

qazwsx
sumber
Saya tidak berpikir Anda perlu SET sebelum DEFAULT
Jonas T

Jawaban:

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

Kemungkinan kedua yang melakukan hal yang sama (terima kasih kepada juergen_d):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';
fancyPants
sumber
9
Ini columnopsional. Anda bisa saja menggunakan ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';atau ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';hasilnya akan sama.
kapad
1
Ini adalah string default yang diminta OP. Saat Anda menentukan tidak ada nilai untuk kolom ini saat menyisipkan baris, nilainya menjadi {}.
fancyPants
1
Apakah menulis dua coldi sebelah satu sama lain benar? (seperti ini col col)
Shafizadeh
4
@ Shafizadeh Ya, benar. Ini memberikan kemungkinan untuk mengganti nama kolom. Yang pertama adalah nama asli, kedua adalah nama baru.
FancyPants
3
Jangan gunakan ini jika Anda hanya perlu mengubah DEFAULTnilainya. Ini akan memproses semua baris tabel secara gratis (sangat panjang pada tabel besar). Gunakan ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>yang instan.
dolmen
114

Sebagai tindak lanjut, jika Anda hanya ingin menetapkan default, cukup yakin Anda dapat menggunakan sintaks ALTER .. SET. Hanya saja, jangan menaruh semua barang lain di sana. Jika Anda akan memasukkan sisa definisi kolom, gunakan sintaks MODIFY atau CHANGE sesuai jawaban yang diterima.

Lagi pula, sintaks ALTER untuk mengatur default kolom, (karena itulah yang saya cari ketika saya datang ke sini):

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

Untuk yang 'literal' juga bisa berupa angka (misalnya ...SET DEFAULT 0). Saya belum mencobanya dengan ...SET DEFAULT CURRENT_TIMESTAMPtetapi mengapa tidak eh?

Dave Jenni
sumber
5
Current_timestamp juga tidak berfungsi untuk saya jika dikutip. Saya harus menggunakan yang berikut ini:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis
7
+1 Jawaban terbaik untuk saya, karena dengan cara itu saya tidak perlu menentukan jenis kolom dan hal-hal lain yang tidak akan berubah!
user2342558
2
Ini adalah jawaban yang efisien untuk hanya mengubah DEFAULTnilainya.
dolmen
1
Jika Anda ingin nilai default menjadi waktu memasukkan, gunakan NOW()atau current_timestamp()@Malaise @Nereis
BlueCacti
16

Jika Anda ingin menambahkan nilai default untuk kolom yang sudah dibuat, ini berfungsi untuk saya:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';
Akash Dole
sumber
2
Ini adalah jawaban terbaik karena Anda tidak perlu menyalin spesifikasi bidang yang ada.
rjh
4

Untuk 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;

Harap catat deklarasi nama kolom ganda

Menghapus DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;
Leonard Lepadatu
sumber
Mengapa nama kolom ganda?
MKJ
2
ALTER TABLE tablename GANTI KOLOM oldColName newColName kolomDefinisi
Leonard Lepadatu
1

Jawaban yang diterima berfungsi dengan baik.

Dalam hal penggunaan kesalahan nilai NULL , pada nilai NULL , perbarui semua nilai null ke nilai default di kolom itu dan kemudian coba lakukan perubahan.

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

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';
Pradeep Kumar Prabaharan
sumber
Apa yang saya butuhkan. Terima kasih
arslion
0

Jika hal di atas tidak bekerja untuk Anda (yaitu: Anda bekerja dengan SQL atau Azure baru ) coba yang berikut:

1) jatuhkan batasan kolom yang ada (jika ada):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) buat yang baru:

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

Coba ini

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

seperti ini

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