細說MySQL表操作
目錄
- 語法
- 查看錶結構
- 檢視所有的表
- 刪除表
- 檢視建立表的語句
- 修改表的字符集和校驗規則
- 修改表名
- 在表中新增新欄位
- 修改表的欄位名
- 修改表中欄位的屬性
- 刪除表中的某個欄位
- 設定某個欄位為主鍵
- 把某個欄位的主鍵屬性刪掉
- 移動欄位
- 清空表資料
- 刪除表資料
- 複製一張表
要想在某一個數據庫裡建立表,首先要使用(進入)這個資料庫,使用命令 use 資料名
如果是通過Windows控制檯建立表,則一定注意,將控制檯的編碼設定為gbk(set names gbk
),因為控制檯就只有一種編碼,那就是gbk。如果不設定會出錯。雖然這裡設定的編碼是gbk,這裡設定的是控制檯的編碼,不是資料庫的編碼也不是表的編碼。資料庫管理系統會自動將表的格式轉換為建立表時設定的格式。
如果是通過MacOS的終端建立表,則需要設定編碼的編碼和資料庫的字元編碼保持一致。
語法
CREATE TABLE 表名 (
欄位名1 資料型別 欄位選項 ,
欄位名2 資料型別 欄位選項 ,
欄位名3 資料型別 欄位選項,
欄位名4 資料型別 欄位選項,
欄位名n 資料型別 (這裡千萬不能再有逗號,否則會報錯)
)CHARACTER SET 字符集 COLLATE 校對規則 ENGINE 儲存引擎方式;
(欄位選項、字符集、校對規則、儲存引擎等都可以不寫)
欄位名: 自定義的名稱,來告訴表資料表頭是什麼
欄位型別: mysql資料型別分三大類,數值型,字串型,日期時間型
欄位選項: 每個欄位有不同的功能,可以新增不同選項來特殊化欄位
主鍵: primary key,作用:加上主鍵後資料不能重複,查詢時主要用這個欄位
ENGINE: 資料庫表的儲存引擎(PHP程式設計師需要掌握MyISAM、InnoDB、Memory),目前我們使用最多的是MyISMAM和InnoDB,預設是InnoDB.該值在my.ini中設定
說明:
(1) 表也可以指定字符集
(2) 如果表指定了字符集和校對規則,則以表指定的為準,如果表沒有指定,則以表所在的資料庫的字符集和校對規則。
(3) engin 就是儲存引擎,比如常用的(MyISAM、InnoDB, Memory), 如果建立表的時指定了這個儲存引擎,則以這個準,如果沒有指定以預設的. 在my.ini中設定的有
(4) AUTO_INCREMENT,加上這個資料就會自動增長
示例:
CREATE TABLE `user`
(
`id` int unsigned AUTO_INCREMENT PRIMARY KEY COMMENT "主鍵ID",
`name` varchar(64) NOT NULL COMMENT "姓名",
`nickname` varchar(64) NOT NULL DEFAULT "" COMMENT "暱稱",
`password` char(32) NOT NULL COMMENT "密碼",
`birthday` date COMMENT "出生日期"
)CHARSET=UTF8 COLLATE=utf8_general_ci ENGINE=InnoDB;
查看錶結構
desc 表名;
describe 表名;
檢視所有的表
show tables;
刪除表
drop table 表名;
該命令一旦執行,那麼這個表連同表中的資料都會被刪掉,雖然有恢復資料的方法,但是很困難,除非你想刪庫跑路
,否則,在遇到在刪除資料或者資料庫的時候一定要謹慎操作,除非真的有必要。
檢視建立表的語句
show create table 表名;
修改表的字符集和校驗規則
ALTER TABLE 表名 CONVERT TO CHARACTER SET 字符集 COLLATE 校對規則;
修改表名
rename table 舊錶名 to 新表名;
在表中新增新欄位
alter table 表名 add 新欄位名 欄位型別 [欄位屬性列表];
原本abc表中,只有兩個欄位,新增一個hobby欄位
在指定位置後面新增新的欄位
alter table 表名 add 新欄位 欄位型別[欄位屬性列表] after 指定位置的欄位名;
在name後面新增一個age欄位
在表的最前面新增新的欄位
alter table 表名 add 新欄位 欄位型別[欄位屬性列表] first;
注意:使用first只能是在表的最前面新增欄位,first後面不要再接欄位名;
修改表的欄位名
alter table 表名 change 舊欄位名 新欄位名 新欄位型別 [新欄位屬性列表];
注意: 不能修改主鍵的名字, 修改欄位名的時候一定要給新欄位名新增屬性設定,並且設定的欄位型別的儲存範圍要大於等於儲存的資料,否則保護機制會提醒,更改後原有的資料無法存下,比如原有的欄位名型別為varchar(4),儲存了一個數據為'1234',如果改為char(2),就無法存下'1234'了,這樣是不允許的。
而且修改欄位名的時候就必須宣告欄位型別,即使是欄位型別和原來的欄位型別一樣也要重新宣告。
下圖中把hobby欄位改成了love
修改表中欄位的屬性
alter table 表名 modify 欄位名 新欄位型別 [新欄位屬性列表];
這個屬性是指欄位的資料型別int ,decimal等
刪除表中的某個欄位
alter table 表名 drop 欄位名;
設定某個欄位為主鍵
alter table 表名 add primary key(要設定為主鍵的欄位名);
把某個欄位的主鍵屬性刪掉
alter table 表名 drop primary key;
注意:如果把某個欄位設定為了主鍵,並且該欄位是auto_increment,那麼我們將無法把他的主鍵屬性刪除掉,如果我們想刪除這個帶auto_increment的屬性的主鍵屬性,那麼就必須直接把這個欄位刪除掉(用alter table 表名 drop 欄位名;來刪除),如果我們還需要這個欄位,只是不需要它成為主鍵了,我們可以再通過增加欄位的方法再添上該欄位,由於一個表中只能有一個主鍵(這個主鍵也可能是由多個欄位組合而成的主鍵),所以當一個表中已經存在一個主鍵時,我們不能再同時新增另一個主鍵,要想在新增其它主鍵就必須刪除原有的主鍵。
只有主鍵和unique才能使用auto_increment,如果一個欄位不是主鍵或unique,那麼他也不能使用auto_increment。
移動欄位
如果把某個欄位移動到另一個欄位的後面(比如把B欄位移動到A欄位後面)
alter table 表名 modify 要被移動的欄位名(B) 要被移動的欄位的定義(和原來的定義一樣) after A欄位名(也就是所說的另一個欄位A);
示例:將name欄位移到nickname欄位後面
注意,要被移動的欄位一定要帶上它本身的屬性,不然會報錯。比如如果使用這樣的語句就會報錯。
錯誤用法:alter table user modify name after nickname;
清空表資料
# 這個只是清空了表的資料,表和表結構都還在,等同於一張從沒插入過資料的新表,如果插入資料主鍵ID重新開始計數
truncate tableName;
從圖中資料的主鍵ID就可以看到,通過truncate 表名清空的資料表就相當於一張新表,好像以前就沒插入過資料一樣。
刪除表資料
# 這條命令刪除整個表的資料,表結構還在,插入資料時,主鍵ID會按照原來以後的主鍵ID基數基礎上繼續計數
delete from 表名;
從圖中可以看出,delete 命令只是刪除資料,被刪除的資料佔用的空間依然存在,所以插入的資料時候主鍵ID會在原來主鍵ID基數的基礎上開始增加。
複製一張表
如果我們需要建立的表和原來的表的結構類似,我們就可以依據原來的表複製一張新表,只是複製了結構,並不複製資料,然後可以通過命令把不需要的欄位刪除掉。這樣我們就可以快速建立一張類似的資料表。
create table 新表名 like 被複制的表名;