推薦學習:
作用是限制如何給欄位賦值
mysql> desc 庫名.表名;
mysql> desc db1.t9;
//如圖所示,每列代表的含義:欄位名 | 型別 | 空 | 鍵值 | 預設值 | 額外設定
mysql> insert into t9 values (null,null,null);
//如上圖所示,約束條件允許為空(NULL),所以此處賦值的時候可以為空,null不區分大小寫
mysql> select * from db1.t9;
mysql> insert into db1.t9(name,sex) values("lucy","girl"); mysql> select * from db1.t9;
//t9表的約束條件裡,第三欄位預設值為NULL,也就是說當沒有給第三欄位賦值的時候,會以預設值填入表中,即如下圖所示預設填入NULL
null //允許為空(預設設定)
not null //不允許為null(空)
key //鍵值型別
default //設定預設值,預設為NULL
extra //額外設定
mysql> create database db2; mysql> create table db2.t1( -> name char(10) not null default "", -> age tinyint unsigned default 19, -> sex enum("m","w") not null default "m" -> );
//建立一個表db2.t1,name欄位的型別為定長char,約束條件是不允許為空,預設值為0個字元,顯示效果入下圖所示;age欄位的型別是微小整數tinyint,約束條件是不允許為負數(unsigned),預設值設定為19,注此處的預設值設定不得超過tinyint型別的範圍,即預設值的設定不能超過255;sex欄位的型別為列舉,enum為單選,約束條件是不允許為空,預設值設定為m;
mysql> desc db2.t1;
mysql> insert into db2.t1(name) values("bob");
//只給name欄位賦值,剩下的欄位由預設值賦值
mysql> select * from db2.t1;
mysql> insert into db2.t1 values("lucy","21","w"); //給欄位賦值,就不會以預設值賦值了 mysql> select * from db2.t1;
mysql> insert into db2.t1 values(null,null,null); //錯誤提示,name欄位不允許為空;name和sex欄位都不能為空 ERROR 1048 (23000): Column 'name' cannot be null mysql> insert into db2.t1 values("null",null,"w"); //"null"的意思不再是空,僅僅是字元null,沒有空的含義了,所以可以給欄位賦值 mysql> insert into db2.t1 values("",null,"w"); //""為0個字元,和空不一樣,也可以給欄位賦值 mysql> select * from db2.t1;
約束條件 | 型別 |
Null(是否允許為空null) | 預設允許 null |
不允許為空 not null | |
Key(鍵值) | 普通索引 index |
唯一索引 unique | |
主鍵 primary key | |
外來鍵 foreign key | |
全文索引 fulltext | |
Default(預設值:不給欄位賦值使用預設值賦值) | 預設不定義時是 null |
定義時是 default(要與欄位型別匹配) | |
Extra(額外設定:預設都沒有額外設定) |
用法
mysql> alter table 庫名.表名 執行動作;
執行動作
add 新增欄位
modify 修改欄位型別
change 修改欄位名
drop 刪除欄位
rename 修改表名
用法
—— 新欄位預設新增在欄位末尾
mysql> alter table 庫名.表名 add 欄位名 型別(寬度) 約束條件;
add 欄位名 型別 [約束條件] after 欄位名;
add 欄位名 型別 [約束條件] first;
不指定位置新增欄位
mysql> alter table db2.t1 add email varchar(50); //不指定新增欄位的位置,預設就在末尾 mysql> desc db2.t1;
在某一欄位後面新增欄位
mysql> alter table db2.t1 add hobby set("eat","drink","play","happy") not null default "eat,drink" after age; //指定新增位置在欄位age之後,條件設定不允許為空,並設定預設值為eat,drink mysql> desc db2.t1;
mysql> select * from db2.t1; //檢視表內容,發現hobby欄位自動新增了預設值
將欄位新增到最前面
mysql> alter table db2.t1 add class char(7) default "B180601" first; //將欄位class新增到最前面 mysql> desc db2.t1;
mysql> select * from db2.t1; //class欄位自動新增預設值
基本用法
—— 修改的欄位型別不能與已儲存的資料衝突
mysql> alter table 庫名.表名 modify 欄位名 型別(寬度) 約束條件;
modify 欄位名 型別 [約束條件] after 欄位名;
modify 欄位名 型別 [約束條件] first;
注:
如果表中這個欄位型別下面的欄位已經有值了,那麼修改的型別與約束不能與欄位裡面已經儲存的資料發生衝突,如果發生衝突則不允許修改。比如,有一個欄位name,裡面儲存了一個資料為bob,那麼把欄位的型別(寬度)改成char(1),則會修改失敗,因為bob的寬度為3,如果將欄位的型別(寬度)改為char(1),則源資料bob就存不下了,由於已儲存的資料優先,所以就不能進行修改;
修改欄位的型別時要注意,不修改的部分要原樣進行抄寫,如果不修改的部分不原樣抄寫,那就相當於對其進行還原即使用預設設定。比如有一個欄位name,他的型別是char(10),約束條件是不允許為空,預設值是"",現在要將其型別寬度改為char(20),其餘沒修改的部分沒有在命令中進行原樣抄寫,那麼輸出結果該欄位的約束條件會變為預設情況,即允許為空,預設值為NULL。改變欄位位置的時候也一樣。
mysql> desc db2.t1;
將欄位age的位置修改到欄位class的後面
mysql> alter table db2.t1 modify age tinyint unsigned default 19 after class; //除了對欄位age的位置進行了修改,其餘不修改的地方如:型別(寬度)、約束條件進行原樣抄寫
mysql> desc db2.t1;
將欄位name的型別變為varchar(15)
mysql> alter table db2.t1 modify name varchar(15) not null default ""; mysql> desc db2.t1;
基本用法
—— 也可以用來修改欄位型別
mysql> alter table 庫名.表名 change 源欄位名 新欄位名 型別(寬度) 約束條件;
注:也可以用來修改型別和約束條件,只需要寫上新的型別和新的約束條件即可
mysql> desc db2.t1;
將欄位名email修改為mail
mysql> alter table db2.t1 change email mail varchar(50);
mysql> desc db2.t1;
將欄位名mail修改為email,並修改約束條件
mysql> alter table db2.t1 change mail email varchar(50) not null default "[email protected]"; //出現錯誤,因為源資料中,mail欄位中的值為NULL,如果將約束條件修改為not null,那麼就與源資料發生衝突,所以修改失敗 ERROR 1138 (22004): Invalid use of NULL value mysql> alter table db2.t1 change mail email varchar(50) default "[email protected]"; mysql> desc db2.t1;
基本用法
mysql> alter table 庫名.表名 drop 欄位名;
mysql> alter table db2.t1 drop email; //刪除庫db2中表t1的欄位email mysql> desc db2.t1; //沒有欄位email,已被刪除
mysql> select * from db2.t1; //欄位email及其資料已被刪除
基本用法
mysql> alter table 庫名.表名 rename 新表名;
庫名.新表名;
mysql> use db2;
mysql> show tables;
mysql> alter table db2.t1 rename stuinfo; //將表名修改為stuinfo
mysql> show tables;
mysql> select * from stuinfo;
推薦學習:
以上就是歸納詳解MySQL知識點之表結構的詳細內容,更多請關注TW511.COM其它相關文章!