SORU
1 EYLÜL 2008, PAZARTESİ


MySQL takas sütun değerleri

Ben bir MySQL tablo ile koordinatları, sütun adları X ve Y Şimdi istiyorum takas sütun değerleri bu tablo, böylece X olur Y ve Y olur X en belirgin çözüm olurdu sütunları yeniden adlandırma, ama ben yapamam yapısı değiştiği için bilmiyorum mutlaka izinleri var.

Bunu yapmak mümkündürGÜNCELLEMEbir şekilde?SET X=,=X UPDATE tablo Yaçıkçası istediğim şey yapmayacağım.

< / ^ hr .

Edit: Lütfen izinleri, yukarıda bahsedilen, benim kısıtlama etkili ALTER TABLE kullanımını veya tablo/veritabanı yapısını değiştiren diğer komutları engeller unutmayın. Sütunları yeniden adlandırma veya yenilerini ekleyerek ne yazık ki seçenek değildir.

CEVAP
18 ŞUBAT 2009, ÇARŞAMBA


Aynen uğraşmak zorunda ve benim bulgular özetleyeyim.

  1. UPDATE table SET X=Y, Y=X Bu yaklaşım, belli ki sadece Y. için her iki değer çıkacak gibi çalışamaz

  2. Burada geçici bir değişken kullanan bir yöntem. İçin http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ yorum Antony sayesinde "DEĞİL" tweak. NULL O olmadan, sorgu beklenmedik bir şekilde çalışır. Tablo yazının sonunda şemaya bakın. Bu yöntem, eğer bunlardan biri NULL değerleri takas yok. Yöntem bu sınırlama yok #3 kullanın.

    UPDATE swap_test SET x=y, y=@temp WHERE (@temp:=x) IS NOT NULL;

  3. Bu yöntem, yine http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ yorum Dipin tarafından teklif edildi. En şık ve temiz çözüm bence. BOŞ ve BOŞ olmayan iki değerleri ile çalışır.

    UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

  4. Ben uydurdum onu başka bir yaklaşım, iş gibi görünüyor:

    UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;

Aslında, 1 tablo bir güncelleme oluyor ve 2. bir eski verileri çekmek için kullanılır.

Bu test benim şema:

CREATE TABLE `swap_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `x` varchar(255) DEFAULT NULL,
  `y` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `swap_test` VALUES ('1', 'a', '10');
INSERT INTO `swap_test` VALUES ('2', NULL, '20');
INSERT INTO `swap_test` VALUES ('3', 'c', NULL);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BigBoyTV

    BigBoyTV

    25 EYLÜL 2013
  • RinconDynamic

    RinconDynami

    1 EKİM 2011
  • spyib

    spyib

    9 Ocak 2007