修改表是指修改數據庫中已經存在的表的定義。修改表比重新定義表簡單,不需要重新加載數據,也不會影響正在進行的服務。
MySQL中通過ALTER TABLE語句來修改表,修改表包括修改表名,修改字段數據類型,修改字段名,增加字段,刪除字段,修改字段的排列位置,更改默認存儲引擎和刪除表的外鍵約束等。
OK,這篇博客會詳細的整理到上面的幾種修改表的方式。現在我們開始。
MySQL中通過sql語句ALTER TABLE來實現表名的修改,語法形式如下:
ALTER TABLE 舊表名 RENAME [TO] 新表名;其中,‘舊表名’參數表示修改前的表名,‘新表名’參數表示修改後的新表名,TO參數是可選參數,這個屬性是否在語句中出現不會影響語句的執行。rename的意思就是重命名,所以這個挺好記的。
OK,現在我們來實際操作下數據庫。我們現在數據庫中創建一張表,建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們修改下上面user表的表名:
ALTER TABLE linkinframe.user RENAME linkinframe.usr;OK,修改成功,我們查看下新的表,表結構和之前的表結構一致,裡面的數據與之前的數據也一致。
字段的數據類型包括整數型,浮點數型,字符串型,二進制類型,日期和時間類型等。數據類型決定了數據的存儲格式,約束條件和有效范圍。表中的每個字段都有數據類型。
MySQL中,ALTER TABLE語句也可以修改字段的數據類型。基本語法如下:
ALTER TABLE 表名 MODIFY 屬性名 數據類型;
其中,‘表名’參數指所要修改的表的名稱,‘屬性名’參數指需要修改的字段的名稱,‘數據類型’參數值修改後的新的數據類型。
OK,現在我們來實際操作下MySQL,首先我們建一張user表,建表語句如下:CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們修改name字段的長度為varhcar(10),執行如下的sql語句來修改:
ALTER TABLE linkinframe.`user` MODIFY name varchar(10) NOT NULL;
ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新數據類型;其中,‘舊屬性名’參數指修改前的字段名,‘新屬性名’參數指修改後的字段名,‘新數據類型’參數指修改後的數據類型,如不需要修改,則將新數據類型設置成與原來的一樣。
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們修改name字段為username字段,執行如下語句來修改:
ALTER TABLE linkinframe.`user` CHANGE name username varchar(10) NOT NULL;
修改後的表結構如下:
當然其中的數據也沒有變化:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們修改name字段為username字段,然後我們將name原來的長度修改成為10,執行如下語句來修改:
ALTER TABLE linkinframe.`user` CHANGE name username varchar(10) NOT NULL;
修改後的表結構如下:
1,CHANGE可以在改變字段數據類型的同時,改變字段名。MODIFY只能用來改變字段的數據類型,不能修改字段名。
2,CHANGE如果不改變字段名,只修改字段類型,CHAGE後面必須跟兩個同樣的字段名。
3,養成良好的習慣,如果是指修改字段的數據結構就使用MODIFY,如果要修改字段名+數據結構就使用CHANGE。
4,在修改表的字段過程中,如果表中已經有記錄,修改數據類型時應該特別小心。因為,修改數據類型時可能會影響表中的數據。
5,特別注意的是,字符類型的字段最好不要改成整數類型,浮點數類型。ALTER TABLE 表名 ADD 屬性名1 數據類型 [完整性約束條件] [FIRST | AFTER 屬性名2];
其中,‘屬性名1’參數指需要增加的字段的名稱,‘數據類型’參數指新增加字段的數據類型,‘完整性約束條件’是可選參數,用來設置新增字段的完整性約束條件;‘FIRST’參數也是可選參數,其作用是將新增字段設置為表的第一個字段,‘AFTER 屬性名
2’參數也是可選參數,其作用是將新增字段添加到‘屬性名2’所指的字段後。如果執行的sql語句中沒有‘FIRST’,‘AFTER 屬性名2’參數指定新增字段的位置,新增的字段默認為表的最後一個字段。
具體有如下4種情況:
現在我們來實際操作下,數據庫建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們user表中添加一個phone字段:
ALTER TABLE linkinframe.`user` ADD phone varchar(11);
OK,添加字段成功,這裡沒有設置‘FRIST’和‘AFTER 屬性名2’參數來指定插入位置,所以新增字段默認為表的最後一個字段。
現在我們來實際操作下,數據庫建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們user表中添加一個phone字段:
ALTER TABLE linkinframe.`user` ADD phone varchar(11) NOT NULL;
CREATE TABLE linkinframe.`user` ( `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們user表中添加一個id字段,然後設置id為user表的主鍵,而且放到表中的第一個位置上。
ALTER TABLE linkinframe.`user` ADD `id` int(11) primary KEY AUTO_INCREMENT first;
現在我們來實際操作下,數據庫建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們user表中name字段之後添加一個phone字段:
ALTER TABLE linkinframe.`user` ADD phone varchar(11) after name;
2,對於一個數據庫來說,字段的排列順序對表不會有什麼影響。但是對於創建表的人來說,將有某種直接或者間接關系的字段放在一起,會更加好的理解這個表的結構,這其實也是一種習慣,我們以後也要盡量將有關系的字段放在一起,方便我們查看。
MySQL中,ALTER TABLE語句也可以刪除表中的字段,語法如下:
ALTER TABLE 表名 DROP 屬性名;其中,‘屬性名’參數指需要從表中刪除的字段的名稱。
現在我們來實際操作下,數據庫建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們user表中刪除掉name字段:
ALTER TABLE linkinframe.`user` DROP name;
ALTER TABLE 表名 MODIFY 屬性名1 數據類型 FIRST|AFTER 屬性名2;其中,‘屬性名1’參數指需要修改位置的字段的名稱,‘數據類型’參數指‘屬性名1’的數據類型,‘FIRST’參數指定位置為表的第一個位置,‘AFTER 屬性名2’參數指定‘屬性名1’插入到‘屬性名2’之後。
現在我們來實際操作下,數據庫建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們user表中的name字段修改到數據庫的第一個位置上去:
ALTER TABLE linkinframe.`user` modify name varchar(5) first;
OK,顯示name字段已經到了user表的第一個位置上了。
現在我們來實際操作下,數據庫建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們user表中的name字段修改到age之後去:
ALTER TABLE linkinframe.`user` modify name varchar(5) after age;
修改字段的排列位置其實也就是修改表的字段,這裡由於沒有修改字段名,所以我們可以使用MODIFY來操作字段的位置,當然我們也可以使用CHANGE來操作字段的位置,只不過這個時候屬性名要寫2遍而已。
比如說我現在不自己寫sql,然後使用MySQL的客戶端來調整下表中的2字段的位置使用的就是CHANGE。
ALTER TABLE `linkinframe`.`user` CHANGE COLUMN `name` `name` VARCHAR(5) CHARACTER SET 'utf8' NULL DEFAULT NULL AFTER `id`;
MySQL存儲引擎是指MySQL數據庫中表的存儲類型。MySQL存儲引擎包括InnoDB,MyISAM,Memory等。不同的表類型有著不同的優缺點,在前面的博客中我也已經整理到了。
在創建表時,存儲引擎就已經設定好了。如果要改變,可以通過重新創建一張表來實現。這麼做是可以達到目的的,但必然會影響到表中的數據,而且操作比較麻煩。
MySQL中,ALTER TABLE語句也可以更改表的存儲引擎的類型,其基本語法如下:
ALTER TABLE 表名 ENGINE=存儲引擎名其中,‘存儲引擎名’參數指設置的新的存儲引擎的名稱。
現在我們來實際操作下,數據庫建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們user表中的存儲引擎設置為MyISAM:
ALTER TABLE linkinframe.`user` ENGINE = MyISAM;
外鍵是一個特殊字段,其將某一表與其父表建立關聯關系。在創建表的時,外鍵約束就已經設定好了。由於特殊需要,與父表之間的關聯關系需要去除,要求刪除外鍵約束。
MySQL中,ALTER TABLE語句也可以刪除表的外鍵約束。其基本語法如下:
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵別名:
其中,‘外鍵別名’參數指創建表時設置的外鍵的代號。
現在我們來實際操作下,數據庫建表語句如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(5) COLLATE utf8_bin NOT NULL, `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL, `age` int(11) DEFAULT '25', PRIMARY KEY (`id`), UNIQUE KEY `age_UNIQUE` (`card_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; CREATE TABLE `address` ( `id` int(11) NOT NULL, `user_id` int(11) DEFAULT NULL, `name` varchar(45) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`), KEY `user_id_idx` (`user_id`), CONSTRAINT `user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;現在我們刪除掉從表address的外鍵關聯,執行如下sql:
ALTER TABLE linkinframe.address DROP foreign key user_id;
OK,查詢結果顯示從表address的外鍵已經不存在了。