Mysql值之約束以及修改資料表
unsigned:這裡約束的意思是沒符號,不能為負數,只能是整數
建立外來鍵約束的表格
提示: 給表新增外來鍵約束的時候,外來鍵列和參照列必須的型別必須一致,就好比上圖的中的兩個表格的型別都是int,但是當我們的父表的型別是smallint,而子表的型別是bigint,這樣也是會報錯的,其中數字的長度或者是否有符號位(unsigned)必須相同,字元的長度可以不相同,索引也必須相同,外來鍵表中的索引會隨著父表的索引自動建立,當父表中設定了主鍵約束,主鍵就會自動建立索引
外來鍵約束的參照操作
- cascade:從父表刪除或更新且自動刪除或更新子表的行
- set null
如果使用該選項,必須保證子表列沒有指定not null
resirict:拒絕對父表的刪除或者更新操作
no action :標準sql的關鍵字,在mysql中與restrict相同
由上圖中的指令,on delete
是在執行刪除指令,當我們重新建立一張表關聯父表,然後為他們新增資料,但是當我們刪除父表中的資料後,子表中的資料也會隨著父表的刪除而刪除,這裡只是展示了刪除,同時更新也是一樣的
表級約束與列級約束
列級約束:就是對一個數據列建立的約束
表級約束:就是對多個數據列建立的約束
列級約束既可以在列定義的時候宣告,也可以在列定義後宣告;表級約束只能在列定義後宣告
修改資料表:新增/刪除列
提示:以下程式碼中[ ]中的內容表示可以寫也可以不寫
- 新增單列:
alter table 表格名稱 add [column] 列名稱column_definition [first|after 列名稱]
由上圖可以看出我們在表格中可以新增列和並且可以確定新新增的列位置
- 新增多列
alter table 表格名稱 add [column] (列名稱 column_definition,...)
- 刪除列
alter table 表格名稱 drop[column] 列名稱
由上圖可以得出,可以刪除一個或者提示刪除倆個
- 新增主鍵約束
alter table 表格名稱 add [constraint[symbol]] primary key [index_type](表字段的名字)
提示:上述指令中的constraint可以寫也可以不寫,symbol是表示給主鍵起的名稱
這裡我們建立了一張表沒有設定主鍵,然後加了一個表字段id,但是還是沒有新增主鍵約束
然後當我們給id添加了主鍵約束後,可以看出key的一列中id中primary,表示新增主鍵約束成功
- 新增唯一約束
alter table 表格名稱 add [constraint[symbol]] unique [index_type](表字段的名字)
- 新增外來鍵約束
alter table 表格名稱 add foreign key(表字段) refeences 父表名稱 (表字段);
- 新增和刪除預設約束
alter table 表格名稱 alter [columns] 表字段 {set default 預設值|drop default}
由上圖可以看出我們新添加了一個表字段為sex,預設值設為女
然後我們刪除預設值後,這個sex欄位就沒有預設約束了
提示:新增預設約束和刪除預設約束只是把set default修改為drop default
- 刪除主鍵約束
alter table 表格名稱 drop primary key
- 刪除唯一約束
alter table 表格名稱 drop unique (約束名稱)
- 刪除外來鍵約束
alter table 表格名稱 drop foreign key 約束名稱
提示:再刪除約束的時候,必須先得查詢約束的名字show indexes from 表格名稱
- 修改列的位置和型別
alter table 表格名稱 modify[ column] 表字段 表字段的型別 列的位置
如上圖所示,我們不僅修改了id的位置,還更改了id的型別,注意:當我們修改欄位的型別時,當從大型別往小型別轉換的時候,有可能會造成資料丟失
- 修改列名稱
alter table 表格名稱 change [column] 舊名稱 新名稱 列的型別[列的位置]
又上圖我們修改了username的名字還更換了位置
- 修改資料表的名稱
方法1:
alter table 表格名稱 rename [to|as] 新名稱
方法2:
rename table 表格名稱 to 新名稱
但是我們不建議隨意修改表名稱和列名稱,有可能會造成某些操作無法進行