SORU
9 HAZİRAN 2009, Salı


sütun eğer varsa değil mysql tablo Ekle

Benim araştırma ve deneyler henüz bir cevap vermiştir değil, bazı yardım için umut ediyorum.

Önceki sürümlerde şimdi eklemek istediğim bir sütun bulunmayan bir uygulamanın dosya yükleme içmiyorum. Sütun ise yeni sütun tabloda zaten varsa sadece el ile, ama yükleme dosyasını ve eklemek istemiyorum.

Tablo aşağıdaki gibi oluşturulur

CREATE TABLE IF NOT EXISTS `#__comm_subscribers` (
      `subscriber_id` int(11) NOT NULL auto_increment,
      `user_id` int(11) NOT NULL default '0',
      `subscriber_name` varchar(64) NOT NULL default '',
      `subscriber_surname` varchar(64) NOT NULL default '',
      `subscriber_email` varchar(64) NOT NULL default '',
      `confirmed` tinyint(1) NOT NULL default '0',
      `subscribe_date` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`subscriber_id`),
      UNIQUE KEY `subscriber_email` (`subscriber_email`)
    ) ENGINE=MyISAM CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' COMMENT='Subscribers for Comm are stored here.';

Eğer aşağıdaki eklersem, create table deyimi altında, sonra sütun zaten var (ve belki de doldurulur) ne olur emin değilim:

ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;
ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';

Yani, bir yerde buldum, denedim. Bu işe görünmüyor ama tamamen doğru kullandım mı emin değilim.

/*delimiter '//'
CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='subscriber_surname' AND TABLE_NAME='#__comm_subscribers'
)
THEN
	ALTER TABLE `#__comm_subscribers`
	ADD COLUMN `subscriber_surname` varchar(64) NOT NULL default '';
END IF;
END;
//
delimiter ';'
CALL addcol();
DROP PROCEDURE addcol;*/

Herkes bunu yapmak için iyi bir yol var mı?

CEVAP
11 AĞUSTOS 2010, ÇARŞAMBA


Burada çalışan bir çözüm () Solaris MySQL 5.0 ile sadece çalıştı:

DELIMITER $$

DROP PROCEDURE IF EXISTS upgrade_database_1_0_to_2_0 $$
CREATE PROCEDURE upgrade_database_1_0_to_2_0()
BEGIN

-- rename a table safely
IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME='my_old_table_name') ) THEN
    RENAME TABLE 
        my_old_table_name TO my_new_table_name,
END IF;

-- add a column safely
IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
        AND COLUMN_NAME='my_additional_column' AND TABLE_NAME='my_table_name') ) THEN
    ALTER TABLE my_table_name ADD my_additional_column varchar(2048) NOT NULL DEFAULT '';
END IF;

END $$

CALL upgrade_database_1_0_to_2_0() $$

DELIMITER ;

İlk bakışta, muhtemelen olması gerekenden daha karmaşık görünüyor, ama burada sorun aşağıdaki ile başa çıkmak için:

  • IF ifadelerin yalnızca iş doğrudan çalıştırıldığında, saklı yordamları,değil, mysql istemci örneğin
  • daha zarif ve özlü SHOW COLUMNS saklı yordam çalışmaz . kullanmak zorunda
  • sınırlayan ifadeleri sözdizimi için MySQL garip, sınırlayıcı saklı yordamları oluşturmak için yeniden tanımlayın. Yok sınırlayıcı geçiş unutmayın!
  • . Tüm veritabanları için küresel, unutmayın. TABLE_SCHEMA=DATABASE() filtre. DATABASE() adını döndürür seçili veritabanı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BradleyWuzHere

    BradleyWuzHe

    25 NİSAN 2011
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • KIT KAT

    KIT KAT

    3 EKİM 2005