1. 程式人生 > >DDL語句--改動表

DDL語句--改動表

pan -- ack id字段 one 有關 ram inf frame


改動表是指改動數據庫中已經存在的表的定義。改動表比又一次定義表簡單。不須要又一次載入數據。也不會影響正在進行的服務

MySQL中通過ALTER TABLE語句來改動表。改動表包含改動表名。改動字段數據類型,改動字段名。添加字段,刪除字段,改動字段的排列位置。更改默認存儲引擎和刪除表的外鍵約束等。

OK,這篇博客會具體的整理到上面的幾種改動表的方式。如今我們開始。

  • 1,改動表名

表名能夠在一個數據庫中唯一的確定一張表

數據庫系統通過表名來區分不同的表。

註意的是。數據庫中的表是唯一的,數據庫中不可能存在兩張同樣的表。


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,改動成功,我們查看下新的表。表結構和之前的表結構一致,裏面的數據與之前的數據也一致。




  • 2,改動字段的數據類型

字段的數據類型包含整數型。浮點數型,字符串型。二進制類型,日期和時間類型等。

數據類型決定了數據的存儲格式,約束條件和有效範圍。表中的每一個字段都有數據類型

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;
技術分享

改動後我們查看下數據庫如今表結構,成功改動了name屬性的長度了。


  • 3,改動字段名

字段名是一張表中唯一的一個字段。

數據庫系統通過字段名來區分表中的不同字段。MySQL中,ALTER TABLE語句也能夠改動表的字段名,基本的語法例如以下:

ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新數據類型;
當中,‘舊屬性名’參數指改動前的字段名。‘新屬性名’參數指改動後的字段名,‘新數據類型’參數指改動後的數據類型。如不須要改動,則將新數據類型設置成與原來的一樣。


詳細有2種情況:

  • 1),僅僅改動字段名

使用ALTER TABLE 語句直接改動字段名。不改變字段的數據類型

建表語句:

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;

改動後的表結構例如以下:

技術分享

當然當中的數據也沒有變化:

技術分享

  • 2)。改動字段名和字段數據類型

使用ALTER TABLE語句直接改動字段名和該字段的數據類型。建表語句:
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;

改動後的表結構例如以下:

技術分享

  • 3),總結

MODIFY和CHANGE都能夠改變字段的數據類型。不同的是:

1,CHANGE能夠在改變字段數據類型的同一時候,改變字段名。MODIFY僅僅能用來改變字段的數據類型,不能改動字段名。

2,CHANGE假設不改變字段名,僅僅改動字段類型。CHAGE後面必須跟兩個相同的字段名。

3,養成良好的習慣,假設是指改動字段的數據結構就使用MODIFY,假設要改動字段名+數據結構就使用CHANGE

4,在改動表的字段過程中,假設表中已經有記錄。改動數據類型時應該特別小心。由於,改動數據類型時可能會影響表中的數據。

5,特別註意的是。字符類型的字段最好不要改成整數類型,浮點數類型。


  • 4,添加字段

在創建表時,表中的字段就已經定義完畢。假設要添加新的字段。能夠通過ALTER TABLE語句進行添加,在MySQL中,ALTER TBALE語句添加字段的基本的語法例如以下:
ALTER TABLE 表名 ADD 屬性名1 數據類型 [完整性約束條件] [FIRST | AFTER 屬性名2];

當中,‘屬性名1’參數指須要添加的字段的名稱,‘數據類型’參數指新添加字段的數據類型。‘完整性約束條件’是可選參數。用來設置新增字段的完整性約束條件;‘FIRST’參數也是可選參數,其作用是將新增字段設置為表的第一個字段,‘AFTER 屬性名

2’參數也是可選參數,其作用是將新增字段加入到‘屬性名2’所指的字段後。假設運行的sql語句中沒有‘FIRST’,‘AFTER 屬性名2’參數指定新增字段的位置,新增的字段默覺得表的最後一個字段


詳細有例如以下4種情況:

  • 1),添加無完整性約束條件的字段

一個完整的字段包含字段名。數據類型和完整性約束條件,添加字段一般都是包含上述內容

當然,依據實際情況,一些字段也能夠不用完整性約束條件進行約束。


如今我們來實際操作下,數據庫建表語句例如以下:

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’參數來指定插入位置,所以新增字段默覺得表的最後一個字段。

  • 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;
技術分享
OK。加入字段成功,這裏沒有設置‘FRIST’和‘AFTER 屬性名2’參數來指定插入位置,所以新增字段默覺得表的最後一個字段。

  • 3),表的第一個位置添加字段

默認情況下。新增字段為表的最後一個字段。假設加上FIRST參數,則能夠將新增字段設置為表的第一個字段
如今我們來實際操作下。數據庫建表語句例如以下:
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;
技術分享

OK,加入成功,並且成功的放到了表中的第一個字段上面了。

  • 4),表的指定位置之後添加字段

在添加字段時,因為特殊原因須要在表的指定位置添加字段。假設加上‘AFTER 屬性名2’參數,那麽新增的字段插入在‘屬性名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字段之後加入一個phone字段:
ALTER TABLE linkinframe.`user` ADD phone varchar(11) after name;
技術分享

OK,加入字段成功,表中phone字段成功的放到了name字段之後。



  • 總結:

1,添加字段時,假設能夠加上完整性約束條件,一定要加上。這樣能夠保證此字段的安全性。甚至能夠提高整個表的數據的安全性。

2,對於一個數據庫來說。字段的排列順序對表不會有什麽影響。

可是對於創建表的人來說。將有某種直接或者間接關系的字段放在一起,會更加好的理解這個表的結構,這事實上也是一種習慣。我們以後也要盡量將有關系的字段放在一起。方便我們查看



  • 5,刪除字段

刪除字段是指刪除已經定義好的表中的某個字段,在表創建完畢之後,假設發現某個字段須要刪除。能夠採用將整個表都刪除,然後又一次創建一張表的做法。這樣做是能夠達到目的的,但必定會影響到表中的數據。並且操作比較麻煩。

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;
技術分享

OK,成功刪除了。


  • 6。改動字段的排列位置

創建表的時候,字段在表中的排列位置都已經確定了。假設要改變字段在表中的排列位置。也能夠通過ALTER TABLE來處理。

MySQL中。改動字段排列位置的ALTER TABLE語句的基本的語法例如以下:

ALTER TABLE 表名 MODIFY 屬性名1 數據類型 FIRST|AFTER 屬性名2;
當中,‘屬性名1’參數指須要改動位置的字段的名稱,‘數據類型’參數指‘屬性名1’的數據類型,‘FIRST’參數指定位置為表的第一個位置。‘AFTER 屬性名2’參數指定‘屬性名1’插入到‘屬性名2’之後。



詳細的分2種情況:

  • 1)。字段改動到第一個位置

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字段改動到數據庫的第一個位置上去:
ALTER TABLE linkinframe.`user` modify name varchar(5) first;

技術分享

OK,顯示name字段已經到了user表的第一個位置上了。


  • 2),字段改動到指定位置

‘AFTER’參數能夠將字段排在表中指定的字段之後


如今我們來實際操作下,數據庫建表語句例如以下:

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;
技術分享
OK,顯示name字段已經到了user表中age之後了。


  • 總結:

改動字段的排列位置事實上也就是改動表的字段,這裏因為沒有改動字段名。所以我們能夠使用MODIFY來操作字段的位置。當然我們也能夠使用CHANGE來操作字段的位置。僅僅只是這個時候屬性名要寫2遍而已。

比方說我如今不自己寫sql,然後使用MySQL的client來調整下表中的2字段的位置使用的就是CHANGE。

ALTER TABLE `linkinframe`.`user` 
CHANGE COLUMN `name` `name` VARCHAR(5) CHARACTER SET 'utf8' NULL DEFAULT NULL AFTER `id`;
技術分享



  • 7。更改表的存儲引擎

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;

技術分享

技術分享


OK。如今我們SHOW CREATE TABLE看下user的表結構,如今user表的存儲引擎成功的變成了MyISAM。
註意:使用Alter語句能夠改變表的存儲引擎,這能夠避免又一次創建表。可是,假設表中已經有非常多的數據。改變存儲引擎可能會造成一些意料之外的影響。假設一個表中已經存在了非常多數據,最好不要輕易更改其存儲引擎


  • 8,刪除表的外鍵約束

外鍵是一個特殊字段,其將某一表與其父表建立關聯關系

在創建表的時。外鍵約束就已經設定好了。

因為特殊須要,與父表之間的關聯關系須要去除,要求刪除外鍵約束。

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的外鍵已經不存在了。

DDL語句--改動表