เพิ่มหลายคอลัมน์หลังจากคอลัมน์เฉพาะใน MySQL


361

ฉันต้องการที่จะเพิ่มหลายคอลัมน์ในตาราง แต่ตำแหน่งคอลัมน์หลังจากlastnameคอลัมน์ที่เรียกว่า

ฉันได้ลองสิ่งนี้แล้ว:

ALTER TABLE `users` ADD COLUMN
(
    `count` smallint(6) NOT NULL,
    `log` varchar(12) NOT NULL,
    `status` int(10) unsigned NOT NULL
) 
AFTER `lastname`;

ฉันได้รับข้อผิดพลาดนี้:

คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชั่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้ ') หลังจากlastname' ที่บรรทัด 7


ฉันจะใช้ AFTER ในแบบสอบถามแบบนี้ได้อย่างไร


5
คุณกำลังพูดภาษาอะไร ดูเหมือน mysql กับฉัน แต่ALTER TABLEไวยากรณ์แตกต่างกันเล็กน้อยระหว่างภาษาถิ่น
Damien_The_Unbeliever


1
ฉันคิดว่าคุณต้องการคำหลัก AFTER ในแต่ละคอลัมน์ที่คุณเพิ่ม ไม่ว่าจะหมายความว่าคุณต้องการทั้ง 3 ชื่อนามสกุลหรือคำสั่งแก้ไขตารางแยกต่อคอลัมน์ใหม่ฉันไม่สามารถพูดได้อย่างแน่นอน
Zec

คำตอบ:


728

ลองสิ่งนี้

ALTER TABLE users
ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`,
ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `count`,
ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `log`;

ตรวจสอบไวยากรณ์


6
[ ในฐานะที่เป็นข้อมูลเพิ่มเติม ] หลายADD, ALTER, DROPและCHANGEคำสั่งที่ได้รับอนุญาตในครั้งเดียวALTER TABLEคำสั่งคั่นด้วยเครื่องหมายจุลภาค นี่คือส่วนขยาย MySQLไปยัง SQL มาตรฐานซึ่งอนุญาตเพียงหนึ่งในแต่ละข้อต่อคำสั่งเปลี่ยนแปลงตาราง
informatik01

@ Ayyappan เราสามารถทำได้ในเซิร์ฟเวอร์ sql?
Roshan

77

หากคุณต้องการเพิ่มคอลัมน์เดียวหลังจากเขตข้อมูลที่เฉพาะเจาะจงแล้วแบบสอบถาม MySQL ต่อไปนี้ควรจะทำงาน:

ALTER TABLE users
    ADD COLUMN count SMALLINT(6) NOT NULL
    AFTER lastname

หากคุณต้องการเพิ่มหลายคอลัมน์คุณต้องใช้คำสั่ง 'เพิ่ม' ในแต่ละครั้งสำหรับคอลัมน์ นี่คือแบบสอบถาม MySQL สำหรับสิ่งนี้:

ALTER TABLE users
    ADD COLUMN count SMALLINT(6) NOT NULL,
    ADD COLUMN log VARCHAR(12) NOT NULL,
    ADD COLUMN status INT(10) UNSIGNED NOT NULL
    AFTER lastname

ชี้ไปที่โน้ต

ในวิธีที่สองADD COLUMN คอลัมน์สุดท้ายควรเป็นคอลัมน์แรกที่คุณต้องการผนวกเข้ากับตาราง

เช่นถ้าคุณต้องการที่จะเพิ่มcount, log, statusในลำดับที่แน่นอนหลังจากlastnameนั้นไวยากรณ์จริงจะเป็น:

ALTER TABLE users
    ADD COLUMN log VARCHAR(12) NOT NULL AFTER lastname,
    ADD COLUMN status INT(10) UNSIGNED NOT NULL AFTER lastname,
    ADD COLUMN count SMALLINT(6) NOT NULL AFTER lastname

3
รุ่นที่สองทำงานได้ดีอย่างสมบูรณ์สำหรับฉัน ฉันใช้ MySql 5.5.25
นอร์แมน

ไม่บิตสุดท้ายของรหัสเพิ่มคอลัมน์ในการสั่งซื้อcount, log, statusหรือcount, status, log?
Sarfaraaz

1
หมายเหตุ: หากคุณไม่เพิ่มบิต 'นามสกุลหลัง' ดังนั้นลำดับที่คอลัมน์สุดท้ายที่คุณใส่ไว้ในรายการแก้ไขตารางจะมาก่อนไม่ได้ผล ดังนั้นเมื่อคุณทำการเปลี่ยนแปลงตารางตารางเพิ่มคอลัมน์ blah1, เพิ่มคอลัมน์คอลัมน์ blah2; (ไม่ต้องใช้คำสั่ง 'หลัง') คอลัมน์ blah1 จะถูกต่อท้ายก่อนจากนั้นจึงเป็น blah2
Hongyi Li

10

ADD COLUMNคุณไม่สามารถพูดถึงชื่อคอลัมน์หลายด้วยเครื่องหมายจุลภาคใช้ คุณต้องพูดถึงADD COLUMNทุกครั้งที่คุณกำหนดคอลัมน์ใหม่


4
ฉันให้ +1 แต่นี่ควรเป็นข้อคิดเห็นสำหรับคำตอบที่ยอมรับ
mjsarfatti

9

อันนี้ถูกต้อง:

ALTER TABLE `users`
    ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`,
    ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `count`,
    ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `log`;

3
ALTER TABLE `users` ADD COLUMN
`COLUMN NAME` DATATYPE(SIZE) AFTER `EXISTING COLUMN NAME`;

คุณสามารถทำได้ด้วยสิ่งนี้ทำงานได้ดีสำหรับฉัน


1

ความเป็นไปได้อย่างหนึ่งคือไม่ต้องกังวลเกี่ยวกับการเรียงลำดับคอลัมน์ในตารางใหม่อีกครั้งและแก้ไขโดยการเพิ่มคอลัมน์ จากนั้นสร้างมุมมองที่มีคอลัมน์ตามลำดับที่คุณต้องการโดยสมมติว่าลำดับนั้นมีความสำคัญอย่างแท้จริง มุมมองสามารถเปลี่ยนแปลงได้ง่ายเพื่อสะท้อนการสั่งซื้อที่คุณต้องการ เนื่องจากฉันไม่สามารถจินตนาการได้ว่าลำดับจะมีความสำคัญสำหรับแอปพลิเคชันเชิงโปรแกรมดังนั้นมุมมองควรเพียงพอสำหรับการสืบค้นด้วยตนเองที่อาจมีความสำคัญ


4
ถ้าฉันอาจเพิ่มสองเซ็นต์ของฉัน "ตำแหน่ง" ไม่ว่าจะเป็นคอลัมน์หรือแถวของตารางควรเป็นสาระสำคัญ สเปรดชีตใช้ตำแหน่งเพื่อค้นหาสิ่งต่าง ๆ ฐานข้อมูลทำไม่ได้
Mike S.

1

แก้ไขตารางlistingเพิ่มcountINT (5), เพิ่มlogVARCHAR (200), เพิ่มstatusVARCHAR (20) หลังจากเปลี่ยนสถานะ

มันจะให้ผลลัพธ์ที่ดี


0

มันใช้งานได้ดีสำหรับฉัน:

ALTER TABLE 'users'
ADD COLUMN 'count' SMALLINT(6) NOT NULL AFTER 'lastname',
ADD COLUMN 'log' VARCHAR(12) NOT NULL AFTER 'count',
ADD COLUMN 'status' INT(10) UNSIGNED NOT NULL AFTER 'log';

ขโมยความคิดเห็นเพื่อรับคะแนนโหวต อย่าทำแบบนั้น
MBouwman

0

วิธีแก้ปัญหาที่ใช้งานได้สำหรับฉันด้วยค่าเริ่มต้น 0 มีดังต่อไปนี้

ALTER TABLE reservations ADD COLUMN isGuest BIT DEFAULT 0

0

อีกวิธีหนึ่งคือ:

ALTER TABLE users
ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `lastname`,
ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `lastname`,
ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`;

จะวางไว้ในลำดับที่คุณต้องการในขณะที่ปรับปรุงคำสั่ง AFTER

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.