歸納詳解MySQL知識點之表結構

2022-03-04 19:00:30
本篇文章給大家帶來了關於的相關知識,其中主要介紹了表結構包括了約束條件以及修改表結構的相關問題,希望對大家有幫助。

推薦學習:

約束條件

  • 作用是限制如何給欄位賦值

檢視約束條件

  • 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其它相關文章!