MySQL tablosundaki sütunlar nasıl taşınır?


207

Şu anda aşağıdaki MySQL tablosuna sahibim: Employees (empID, empName, department);

Tabloyu aşağıdaki şekilde değiştirmek istiyorum: Employees (empID, department, empName);

Bu ALTERifadeler kullanılarak nasıl yapılabilir ?

Not: Yalnızca sütun konumlarını değiştirmek istiyorum.


Neden olduğunu sorabilir miyim? Sütun düzeni hemen hemen sadece estetik bir sorundur ...
deceze

6
@deceze belki de değil - bir ifadedeki değerlerin sırasını tanımlar SELECT *. (Değerlerin sırası önemliyse, ifadede açıkça belirtilmelidir, ancak OP'nin burada tam kontrolü yoktur.)
Ted Hopp

1
Hiçbir şeyi etkilemediğini biliyorum. Orijinal tablomda çok sayıda sütun var, bu yüzden son eklenen 3 sütun ekledim. Ama onları kullanımını kolaylaştırmak için pozisyonlarda 3-4-5 görüntülemek istediğiniz SELECTbeyanı
sumit

6
@iSumitG: Ayrıca AFTER column, bununla da kullanılabileceğini unutmayın ALTER TABLE ADD column. (bir dahaki sefere bazı alanlar eklersiniz.)
ypercubeᵀᴹ

2
Bir mysql dökümü yüklüyse, değerlere insert kullanır. Örneğin, prod'dan dev'e veri yüklüyorsanız ve sütunlar arızalıysa, bir hata alırsınız. Bu yüzden biri bunu yapmak isteyebilir.
Yaşasın

Yanıtlar:


345

EmpName bir VARCHAR (50) sütunuysa:

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

DÜZENLE

Yorumlar başına şunları da yapabilirsiniz:

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;

Tekrarının empNamekasıtlı olduğuna dikkat edin . MySQL'e aynı sütun adını korumak istediğinizi söylemelisiniz.

Her iki sözdizimi sürümünün de MySQL'e özgü olduğunu bilmelisiniz. Örneğin PostgreSQL veya diğer birçok DBMS'de çalışmazlar.

Başka bir düzenleme: Bir yorumda @Luis Rossi'nin işaret ettiği gibi, değiştirilmiş sütun tanımını değiştiriciden hemen önce tamamen belirtmeniz gerekir AFTER. Yukarıdaki örnekler sadece vardır VARCHAR(50), ancak başka özelliklere ( NOT NULLveya varsayılan bir değer gibi) ihtiyacınız varsa bunları da eklemeniz gerekir. Consult üzerinde dokümanALTER TABLE fazla bilgi için.


6
Sadece bir not: MODIFY, sürüm 4'e kadar desteklenmez.
Erre Efe

4
Sözdizimi sütun adını değiştirmek isteyebileceğinizi düşündüğü için sütun adını tekrarlamanız gerekir. Örnek: ALTER TABLE Çalışanları KOLUNU DEĞİŞTİR empName empName varchar (50) departman SONRASI;
brianjcohen

Değişen siparişin veritabanı SQL dökümlerine yansıtılmayacağını unutmayın.
skalee

3
@SalehEnamShohag - Evet, dokümanlara göre , COLUMNanahtar kelime ALTER TABLEifadelerde isteğe bağlıdır . Kullanmayı tercih ediyorum çünkü ifadeyi daha okunabilir hale getirdiğini düşünüyorum.
Ted Hopp

1
Benim için iyi çalışıyor, benim durumumda sütun olduğunu tanımlamak gerekiyordu NOT NULL DEFAULT 1, bu örnekte sütun türünden hemen sonra yapılırVARCHAR(50)
Luiz Rossi

67

Sütun konumunu değiştir:

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;

İlk konuma taşımanız gerekirse, ALTER TABLE CHANGE [COLUMN] sorgusunun sonunda FIRST terimini kullanmanız gerekir:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;

24
İlk pozisyona nasıl taşınacağından
bahsetmek

2
Bunun büyük bir masada nasıl performans göstereceği hakkında bir fikrin var mı? Sadece bazı meta verileri mi değiştiriyor, yoksa aslında diskteki verileri yeniden düzenlemek zorunda mı?
Kip

6
nevermind, 3.9M satırları olan bir masada deneyerek kendi sorumu yanıtladı, yaklaşık 2 dakika sürdü. bu yüzden kesinlikle bazı meta verileri değiştirmekten daha fazlasını yapıyor.
Kip

14

phpMyAdmin, bunun için bir tablonun yapı görünümünde bir GUI sağlar. Taşımak istediğiniz sütunu seçmek için işaretleyin ve sütun listesinin altındaki değiştirme işlemini tıklayın. Daha sonra tüm sütun özelliklerini değiştirebilirsiniz ve ekranın en sağında 'sütunu taşı' işlevini bulacaksınız.

Tabii ki bu sadece sorguları mükemmel bir şekilde en iyi cevapta inşa ediyor, ancak GUI hayranları alternatifi takdir edebilir.

benim phpMyAdmin sürüm 4.1.7


1
Soru özellikle "Bu ALTER deyimleri kullanılarak nasıl yapılabilir" sorusunu sorar. MySQL çalıştıran herkes phpMyAdmin kullanmaz.
Caleb

3
Ben phpMyAdmin gibi GUI araçlarından sorgu çıktı gözlemleyerek günümüzde bir komut satırında ne yaptığımı çok öğrenmek. Bu yazı için ppl bu kadar uygun görüyorum kadar çok downvotes almak için mutluyum: 1 kişi bunu görecek, işlerini rahat hissettikleri bir ortamda yapacak, biraz öğrenecek ve devam edecek.

Bu eylem için phpmyadmi eylemi yapan komutu göstermez. Bulunamadı
Tebe

2
Vay be, OP bir ALTER SQL için talep cevapları hile ve tamamlar alternatif bir çözüm için çok öfke.
Ewen

1

Bunu, bir ürünün sonraki aşamalarında tanıtılan bir sütun için 10+ tabloda çalıştırmak zorunda kaldım. Böylece tüm 'ilgili' tablolar için alter komutunu üretmek için bu hızlı düzensiz komut dosyasını yazdık.

SET @NeighboringColumn = '<YOUR COLUMN SHOULD COME AFTER THIS COLUMN>';

SELECT CONCAT("ALTER TABLE `",t.TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` 
`",COLUMN_NAME,"` ", c.DATA_TYPE, CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT 
NULL THEN CONCAT("(", c.CHARACTER_MAXIMUM_LENGTH, ")") ELSE "" END ,"  AFTER 
`",@NeighboringColumn,"`;")
FROM information_schema.COLUMNS c, information_schema.TABLES t
WHERE c.TABLE_SCHEMA = '<YOUR SCHEMA NAME>'
AND c.COLUMN_NAME = '<COLUMN TO MOVE>'
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
AND @NeighboringColumn IN (SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS c2 
    WHERE c2.TABLE_NAME = t.TABLE_NAME);
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.