第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果列不存在,請將列添加到mysql表中

如果列不存在,請將列添加到mysql表中

月關寶盒 2019-09-02 09:02:16
我的研究和實驗尚未得出答案,所以我希望得到一些幫助。我正在修改應用程序的安裝文件,在以前的版本中沒有我想要添加的列。我不想手動添加列,而是在安裝文件中,并且只有在表中不存在新列時才這樣。該表創(chuàng)建如下: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.';如果我在create table語句下添加以下內容,那么我不確定如果列已經存在(并且可能已填充)會發(fā)生什么:ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';所以,我嘗試了以下我找到的地方。這似乎不起作用,但我不完全確定我正確使用它。/*delimiter '//'CREATE PROCEDURE addcol() BEGINIF NOT EXISTS(SELECT * FROM information_schema.COLUMNSWHERE 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;*/有沒有人有一個很好的方法來做到這一點?
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

請注意,INFORMATION_SCHEMA5.0之前的MySQL不支持。5.0之前也不支持存儲過程,所以如果你需要支持MySQL 4.1,這個解決方案并不好。


使用數據庫遷移的框架使用的一種解決方案是在數據庫中記錄模式的修訂號。只是一個包含單列和單行的表,其中一個整數表示哪個版本是當前有效的。更新架構時,請遞增數字。


另一種解決方案是只嘗試的ALTER TABLE ADD COLUMN命令。如果列已存在,則應該拋出錯誤。


ERROR 1060 (42S21): Duplicate column name 'newcolumnname'

在升級腳本中捕獲錯誤并忽略它。


查看完整回答
反對 回復 2019-09-02
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

這是一個可行的解決方案(剛剛在Solaris上使用MySQL 5.0):


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 ;

乍一看,它可能看起來比它應該更復雜,但我們必須在這里處理以下問題:


IF 語句只能在存儲過程中使用,而不能直接運行,例如在mysql客戶端中

更優(yōu)雅和簡潔SHOW COLUMNS在存儲過程中不起作用,因此必須使用INFORMATION_SCHEMA

在MySQL中,分隔語句的語法很奇怪,因此您必須重新定義分隔符才能創(chuàng)建存儲過程。不要忘記切換分隔符!

INFORMATION_SCHEMA是所有數據庫的全局,不要忘記過濾TABLE_SCHEMA=DATABASE()。DATABASE()返回當前所選數據庫的名稱。



查看完整回答
反對 回復 2019-09-02
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

大多數答案都解決了如何在存儲過程中安全地添加列,我需要在不使用存儲過程的情況下安全地向表添加列,并發(fā)現MySQL不允許在SPIF Exists()外部使用。我會發(fā)布我的解決方案,它可能會幫助處于相同情況的人。


SELECT count(*)

INTO @exist

FROM information_schema.columns 

WHERE table_schema = database()

and COLUMN_NAME = 'original_data'

AND table_name = 'mytable';


set @query = IF(@exist <= 0, 'alter table intent add column mycolumn4 varchar(2048) NULL after mycolumn3', 

'select \'Column Exists\' status');


prepare stmt from @query;


EXECUTE stmt;


查看完整回答
反對 回復 2019-09-02
  • 3 回答
  • 0 關注
  • 1409 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號