mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...
添加和刪除列
使用ADD向表中添加新列,使用DROP刪除現有列。DROP col_name是對標準SQL的MySQL擴展。
若要在表行的特定位置添加列,請使用FIRST col_name 或者 AFTER col_name。默認情況是添加到最后。
如果表只包含一列,則不能刪除該列。如果您想要刪除表,請使用DROP TABLE語句。
如果從表中刪除列,那么列也將從其所屬的任何索引中刪除。如果組成一個索引的所有列都被刪除,那么這個索引也會被刪除。如果使用CHANGE或MODIFY縮短存在索引的列,而結果列長度小于索引長度,MySQL會自動縮短索引。
對于ALTER TABLE ... ADD,如果列具有使用非確定性函數的表達式默認值,則語句可能會產生警告或錯誤。
重命名、重新定義和重新排序列
CHANGE、MODIFY、RENAME COLUMN 和 ALTER子句允許更改現有列的名稱和定義。它們具有以下比較特征:
●CHANGE:
■ 可以重命名列并更改其定義。
■ 具有比MODIFY、RENAME COLUMN更多的功能,但以犧牲某些操作的便利性為代價。如果不重命名,CHANGE 需要對列進行兩次命名,如果只重命名,則需要重新指定列定義。
■ 使用FIRST或AFTER,可以對列重新排序。
●MODIFY:
■ 可以更改列定義,但不能更改列的名稱。
■ 更改列定義而不重命名比 CHANGE 更方便。
■ 使用FIRST或AFTER,可以對列重新排序。
●RENAME COLUMN:
■ 可以更改列名,但不能更改其定義。
■ 在不更改列定義的情況下重命名列比CHANGE更方便。
●ALTER:僅用于更改列的默認值。
CHANGE是對標準SQL的MySQL擴展。MODIFY和RENAME COLUMN是用于Oracle兼容性的MySQL擴展。
若要更改列名稱和定義,請使用CHANGE,指定新舊名稱和新定義。例如,要將一個INT NOT NULL列從a重命名為b,并更改其定義為使用BIGINT數據類型,同時保留NOT NULL屬性,請這樣做:
若要更改列定義但不更改其名稱,請使用CHANGE或MODIFY。使用CHANGE,語法需要兩個列名,因此必須兩次指定相同的名稱才能保持名稱不變。例如,要更改b列的定義,可以這樣做:
MODIFY更方便在不改變名稱的情況下改變定義,因為它只需要列名一次:
若要更改列名,但不更改其定義,請使用CHANGE或RENAME COLUMN。對于CHANGE,語法需要列定義,因此要保持定義不變,必須重新指定列當前具有的定義。例如,要將一個INT NOT NULL列從b重命名為a,請這樣做:
RENAME COLUMN更方便在不改變定義的情況下更改名稱,因為它只需要新舊名稱:
通常,不能將列重命名為表中已經存在的名稱。但是,有時情況并非如此,比如交換名稱或在循環中移動名稱。如果一個表有名為a、b和c的列,這些是有效的操作:
對于使用CHANGE或MODIFY進行的列定義更改,定義必須包括數據類型和應該應用于新列的所有屬性,而不是索引屬性(如PRIMARY KEY 或 UNIQUE)。原始定義中出現但未為新定義指定的屬性將不進行繼承。假設一個列col1被定義為INT UNSIGNED DEFAULT 1 COMMENT ‘my column‘,然后你按照如下方式修改該列,只打算將INT改為BIGINT:
該語句將數據類型從INT更改為BIGINT,但也刪除了UNSIGNED、DEFAULT和COMMENT屬性。為了保留它們,語句必須明確地包含它們:
對于使用CHANGE或MODIFY更改數據類型,MySQL嘗試將現有的列值盡可能轉換為新的類型。
警告
這種轉換可能會導致數據的更改。例如,如果縮短字符串列,值可能會被截斷。如果轉換到新的數據類型會導致數據丟失,為了防止操作成功,請在使用ALTER TABLE之前啟用嚴格SQL模式。
如果使用CHANGE或MODIFY縮短存在索引的列,而結果列長度小于索引長度,MySQL會自動縮短索引。
對于通過CHANGE或RENAME COLUMN重命名的列,MySQL自動將這些引用重命名為重命名列:
●引用舊列的索引,包括不可見的索引和禁用的MyISAM索引。
●引用舊列的外鍵。
對于通過CHANGE或RENAME COLUMN重命名的列,MySQL不會自動將這些引用重命名為重命名列:
●引用重命名列的生成列和分區表達式。必須如同ALTER TABLE語句中一樣,使用CHANGE重新定義這些表達式。
●引用重命名列的視圖和存儲程序。必須手動更改這些對象的定義以引用新的列名。
若要對表中的列重新排序,請在CHANGE或MODIFY操作中使用FIRST和AFTER。
ALTER ... SET DEFAULT 或 ALTER ... DROP DEFAULT分別為列指定新的默認值或刪除舊的默認值。如果舊的默認值被刪除,并且列可以為NULL,那么新默認值為NULL。如果列不能為NULL, MySQL會分配一個默認值。
主鍵和索引
DROP PRIMARY KEY刪除主鍵。如果沒有主鍵,就會發生錯誤。
如果啟用了sql_require_primary_key系統變量,嘗試刪除主鍵會產生錯誤。
如果在表中添加UNIQUE INDEX 或 PRIMARY KEY,MySQL會將其存儲在任何非唯一索引之前,以便盡早檢測重復鍵。
DROP INDEX刪除索引。這是對標準SQL的MySQL擴展。要確定索引名稱,請使用SHOW INDEX FROM tbl_name。
有些存儲引擎允許在創建索引時指定索引類型。index_type說明符的語法是USING type_name。首選位置在列列表之后。在以后的MySQL版本中,將不再支持使用列列表之前的選項。
index_option值指定索引的其他選項。USING就是這樣一個選項。
RENAME INDEX old_index_name TO new_index_name 重命名索引。這是對標準SQL的MySQL擴展。表的內容保持不變。old_index_name必須是表中未被ALTER TABLE語句刪除的現有索引的名稱。new_index_name是新的索引名,在應用了更改之后,它不能在結果表中索引名重復。兩個索引名都不能是PRIMARY。
如果在MyISAM表上使用ALTER TABLE,那么將在單獨的批處理中創建所有非惟一索引(如同REPAIR TABLE)。當有很多索引時,這會使ALTER TABLE更快。
對于MyISAM表,可以顯式地控制鍵更新。使用ALTER TABLE ... DISABLE KEYS告訴MySQL停止更新非唯一索引。然后使用ALTER TABLE ... ENABLE KEYS 來重新創建丟失的索引。MyISAM使用一種特殊的算法來實現這一點,這種算法比逐個插入鍵要快得多,因此在執行批量插入操作之前禁用鍵應該會有相當大的速度提高。使用ALTER TABLE ... DISABLE KEYS除了前面提到的權限外,還需要INDEX權限。
雖然禁用了非惟一索引,但是對于SELECT和EXPLAIN等語句,它們會被忽略,否則它們將使用這些索引。
在使用ALTER TABLE語句之后,可能需要運行ANALYZE TABLE來更新索引基數信息。
ALTER INDEX操作允許將索引變為可見或不可見。優化器不使用不可見索引。索引可見性的修改適用于主鍵以外的索引(顯式或隱式)。該特性與存儲引擎無關(支持任何引擎)。
官方文檔地址:
https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
MySQL的SQL語句 - 數據定義語句(6)- ALTER TABLE 語句 (3)
標簽:兼容性???ble???視圖???支持???就會???屬性???命名???sql語句???mamicode
本條技術文章來源于互聯網,如果無意侵犯您的權益請點擊此處反饋版權投訴
本文系統來源:https://blog.51cto.com/15023289/2560867
總結
以上是生活随笔為你收集整理的mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql rename table_M
- 下一篇: 腾讯优酷后!爱奇艺限制投屏 会员只能看4