จะเปลี่ยนคอลัมน์และเปลี่ยนค่าเริ่มต้นได้อย่างไร?


190

ฉันได้รับข้อผิดพลาดต่อไปนี้ขณะที่พยายามแก้ไขชนิดข้อมูลของคอลัมน์และตั้งค่าเริ่มต้นใหม่:

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

ข้อผิดพลาด 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชั่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องใกล้กับ 'VARCHAR (255) ไม่ได้ตั้งค่าเริ่มต้นเป็นศูนย์' {} '' ที่บรรทัด 1


ฉันไม่คิดว่าคุณต้องตั้งค่าก่อนเริ่มต้น
Jonas T

คำตอบ:


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

ความเป็นไปได้ที่สองซึ่งทำเช่นเดียวกัน (ด้วย juergen_d):

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

9
columnเป็นตัวเลือก คุณสามารถใช้ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';หรือALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';ผลลัพธ์ก็จะเหมือนกัน
kapad

1
เป็นสตริงเริ่มต้นที่ OP ขอ {}เมื่อคุณระบุไม่มีค่าสำหรับคอลัมน์นี้เมื่อแทรกแถวค่าจะกลายเป็น
fancyPants

1
การเขียนสองตัวcolติดกันถูกต้องหรือไม่ (เช่นนี้col col)
Shafizadeh

4
@Shafizadeh ใช่มันเป็น สิ่งนี้ให้ความเป็นไปได้ในการเปลี่ยนชื่อคอลัมน์ ชื่อแรกคือชื่อจริงส่วนที่สองคือชื่อใหม่
fancyPants

3
อย่าใช้สิ่งนี้หากคุณต้องการเปลี่ยนเฉพาะDEFAULTค่า สิ่งนี้จะประมวลผลแถวทั้งหมดของตารางโดยไม่มีอะไร (ยาวมากบนโต๊ะขนาดใหญ่) ใช้แทนALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>ซึ่งเป็นแบบทันที
dolmen

114

หากคุณต้องการตั้งค่าเริ่มต้นให้แน่ใจว่าคุณสามารถใช้ไวยากรณ์ ALTER .. SET อย่าเพิ่งใส่ของอื่น ๆ ไว้ในนั้น หากคุณจะใส่คำจำกัดความของคอลัมน์ที่เหลือลงไปให้ใช้ไวยากรณ์ MODIFY หรือ CHANGE ตามคำตอบที่ยอมรับ

อย่างไรก็ตามไวยากรณ์ ALTER สำหรับการตั้งค่าคอลัมน์เริ่มต้น (เนื่องจากเป็นสิ่งที่ฉันกำลังมองหาเมื่อฉันมาที่นี่):

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

สำหรับ 'ตัวอักษร' ซึ่งอาจเป็นตัวเลข (เช่น...SET DEFAULT 0) ฉันไม่ได้ลองด้วย...SET DEFAULT CURRENT_TIMESTAMPแต่ทำไมไม่เอ๊ะ


5
current_timestamp ปัจจุบันยังไม่ทำงานสำหรับฉันหากเสนอราคา ฉันต้องใช้สิ่งต่อไปนี้:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis

7
+1 คำตอบที่ดีที่สุดสำหรับฉันเพราะด้วยวิธีนี้ฉันไม่จำเป็นต้องระบุประเภทของคอลัมน์และสิ่งอื่น ๆ ที่จะไม่เปลี่ยนแปลง!
user2342558

2
นี่คือคำตอบที่มีประสิทธิภาพในการเปลี่ยนเฉพาะDEFAULTค่า
dolmen

1
หากคุณต้องการให้ค่าเริ่มต้นเป็นเวลาของการแทรกให้ใช้NOW()หรือcurrent_timestamp()@Malaise @Nereis
BlueCacti

16

หากคุณต้องการเพิ่มค่าเริ่มต้นสำหรับคอลัมน์ที่สร้างไว้แล้วสิ่งนี้ใช้ได้กับฉัน:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';

2
นี่คือคำตอบที่ดีที่สุดเนื่องจากคุณไม่จำเป็นต้องคัดลอกข้อมูลจำเพาะของฟิลด์ที่มีอยู่
rjh

4

สำหรับ 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;

โปรดทราบการประกาศชื่อคอลัมน์สองครั้ง

การลบ DEFAULT CURRENT_TIMESTAMP:

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

ทำไมชื่อคอลัมน์คู่
MKJ

2
เปลี่ยนตาราง tablename เปลี่ยนคอลัมน์ oldColName newColName columnDefinitions
Leonard Lepadatu

1

คำตอบที่ได้รับการยอมรับใช้งานได้ดี

ในกรณีที่ใช้ข้อผิดพลาดค่า NULL ไม่ถูกต้องบนค่า NULLให้อัพเดตค่า Null ทั้งหมดเป็นค่าเริ่มต้นในคอลัมน์นั้นแล้วลองทำการแก้ไข

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

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

สิ่งที่ฉันต้องการ ขอบคุณ
arslion

0

ในกรณีข้างต้นไม่ได้ผลสำหรับคุณ (เช่น: คุณกำลังทำงานกับSQL หรือ Azure ใหม่ ) ให้ลองปฏิบัติดังนี้:

1) วางข้อ จำกัด คอลัมน์ที่มีอยู่ (ถ้ามี):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) สร้างใหม่:

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

0

ลองสิ่งนี้

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

แบบนี้

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.