在mysql運維操作中會經常使用到alter這個修改表的命令,alter tables允許修改一個現有表的結構,比如增加或刪除列、創造或消去索引、改變現有列的型別、或重新命名列或表本身,也能改變表的註釋和表的型別。
下面就針對alter修改命令的使用做一梳理:
在mysql運維操作中會經常使用到alter這個修改表的命令,alter tables允許修改一個現有表的結構,比如增加或刪除列、創造或消去索引、改變現有列的型別、或重新命名列或表本身,也能改變表的註釋和表的型別。
下面就針對alter修改命令的使用做一梳理:
1)刪除列
alter table 表名 DROP 列名; //或者 alter table 表名 drop column 列名;
-------------------------------------------------------------------------------------
drop database 庫名; //刪除庫
drop table 表名; //刪除表
delete from 表名; //清空表中所有資料,但這張表沒有刪除,保留的是空表。
delete from 表名 where ...; //刪除表中欄位
------------------------------------------------------------------------------------
2)增加列
alter table 表名 ADD 列名 列的屬性(如INT NOT NULL COMMENT '註釋說明')
3)修改列的型別資訊。alter table 表名 CHANGE 列名 新列名 新列屬性;
alter table 表名 CHANGE 列名 新列名(這裡可以用和原來列同名即可) BIGINT NOT NULL COMMENT '註釋說明'
4)重新命名列
alter table 表名 CHANGE 列名 新列名 BIGINT NOT NULL COMMENT '註釋說明'
5)重新命名錶
alter table 表名 RENAME 表新名
6)刪除表中主鍵
alter table 表名 drop primary key
-------------------------------------------------------------------------------------
如若刪除帶自增屬性的主鍵,那麼要先刪除自增長,再刪除主鍵
Alter table haha change id id int(10); //刪除自增長
Alter table haha drop primary key; //刪除主建
-------------------------------------------------------------------------------------
7)新增主鍵
alter table 表名 ADD CONSTRAINT PK_表名 PRIMARY KEY(列名1,列名2)
-------------------------------------------------------------------------------------
Alter table haha add primary key(id); //將haha表的id列新增主鍵
Alter table haha change id id int(10) not null auto_increment; //自增長屬性
-------------------------------------------------------------------------------------
sql中constraint字首的用意(PK、UK、DF、CK、FK)
--主鍵
constraint PK_欄位 primary key(欄位),
--唯一約束
constraint UK_欄位 unique key(欄位),
--預設約束
constrint DF_欄位 default('預設值') for 欄位,
--檢查約束
constraint CK_欄位 check(約束。如:len(欄位)>1),
--主外來鍵關係
constraint FK_主表_從表 foreign(外來鍵欄位) references 主表(主表主鍵欄位)
-------------------------------------------------------------------------------------
8)新增/建立索引
alter table 表名 add index 索引名 列名; //普通索引
ALTER TABLE 表名 ADD UNIQUE index 索引名 (列名1,列名2); //聯合索引
ALTER TABLE 表名 ADD PRIMARY index KEY 索引名 列名; //主鍵索引
-------------------------------------------------------------------------------------
SHOW INDEX FROM 表名字; //查詢索引
刪除索引可以使用ALTER TABLE或DROP INDEX語句來實現。DROP INDEX可以在ALTER TABLE內部作為一條語句處理
DROP index 索引名 ON 表名字 列名; //刪除普通索引
ALTER TABLE 表名 DROP INDEX 索引名 列名; //刪除普通索引
ALTER TABLE 表名 DROP UNIQUE 索引名 (列名1,列名2); //刪除聯合索引
ALTER TABLE 表名 DROP PRIMARY KEY 索引名 列名; //刪除主鍵索引
-------------------------------------------------------------------------------------
9)新增唯一限制條件索引
alter table 表名 add unique emp_name2(cardnumber); //empname 型別 為String 字串型別
10)建立聯合唯一索引
alter table 表名 ADD UNIQUE INDEX 索引名 (列名1,列名2);
alter ignore table 表名 add unique index(user_id,user_name); //它會刪除重複的記錄(別怕,會保留一條),然後建立唯一索引,高效而且人性化.(慎用)
11)修改欄位屬性
alter table 表名 modify column 欄位名 型別
alter table 表名 modify column 欄位1 型別,欄位2 型別
例如:將class表的name列屬性改成varchar(100)
alter table class modify column name varchar(100);
或者:
alter table 表名 change 列名 列名 varchar(100);
alter table class change name name varchar(100);
---------------------------------------------------------------------------------------------------------------------------
上面提到了使用alter命令修改表名,修改列名;那麼修改欄位值,就需要使用update命令,如下:
mysql> select * from huanqiu.haha; +----+-----------+ | id | name | +----+-----------+ | 1 | wangshibo | | 11 | ouou | | 19 | hahahahha | +----+-----------+ 3 rows in set (0.00 sec) mysql> update huanqiu.haha set name="wangshikui" where id=11; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from huanqiu.haha; +----+------------+ | id | name | +----+------------+ | 1 | wangshibo | | 11 | wangshikui | | 19 | hahahahha | +----+------------+ 3 rows in set (0.01 sec)
修改root登陸密碼:
mysql> update mysql.user set password=password("654321") where host='192.168.1.101' and user="root";
--------------------------------------------------------------------------------------------------------------------------------------------------
update 表名 set 列名="新的欄位值" [where 限制條件1 and 限制條件1];
update 表名 set 列名1="新的欄位值",列名2="新的欄位值" [where 限制條件1 and 限制條件1] [ORDER BY ...] [LIMIT row_count];
insert into 表名 values(所有欄位的插入值);
insert into 表名(指定欄位) values(指定欄位);
insert into 表名 values(所有欄位的插入值),(所有欄位的插入值),(所有欄位的插入值); //批量插入
mysql> select * from huanqiu.haha; +----+------------+ | id | name | +----+------------+ | 11 | wangshikui | +----+------------+ 1 row in set (0.00 sec) mysql> insert into huanqiu.haha values(1,"wangshibo"),(2,"wangshikui"),(3,"wangjuan"),(4,"wangman"); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from huanqiu.haha; +----+------------+ | id | name | +----+------------+ | 1 | wangshibo | | 2 | wangshikui | | 3 | wangjuan | | 4 | wangman | | 11 | wangshikui | +----+------------+
--------------------------------------------------------------------------------------------------------------------------------------------------
建立表時指定AUTO_INCREMENT自增值的初始值:
mysql> CREATE TABLE 表名 (ID INT(5) PRIMARY KEY AUTO_INCREMENT)AUTO_INCREMENT=100;
通過ALTER TABLE 修改初始值(但要大於表中的AUTO_INCREMENT自增值,否則設定無效):
mysql>ATLER TABLE 表名 AUTO_INCREMENT=100;
如果自增序列的最大值被刪除了,則在插入新記錄時,該值被重用。
就是說如果表中原本有AUTO_INCREMENT屬性值連續為78、100的值,但100這個資料被刪除了,下此再新增資料的時候自增值為101,100被重用了。
即使在你將整個表中的所有資料delete清空後,之前的自增序列最大值還是會被重用。
解決辦法是使用下面命令:
ATLER TABLE 表名 AUTO_INCREMENT=0; //重新設定自增初始值
-----------------------------------------------------------------------------------------------------------------------------------------------
設定AUTO_INCREMENT_INCREMENT以及AUTO_INCREMENT_offset使用者變數值(重啟MySQL之後,這些修改會恢復為初始值1):
mysql>SET auto_increment_increment=10; //自增量每次增加的值改為10, mysql>SET auto_increment_offset=2; //第一次載入數值時的偏移值的個位值 mysql>SHOW VARIABLES LIKE 'AUTO_INC%'; //檢視修改後變數的值 mysql>SHOW TABLE STATUS FROM NAME_DB; //顯示資料庫NAME_DB中所有表的資訊 mysql>SHOW CREATE TABLE NAME_TBL; //顯示錶NAME_TBL建立時的資訊 mysql>SHOW VARIABLES LIKE 'AUTO_INC%'; //顯示MySQL的AUTO_INC開頭的使用者會話變數(SHOW GLOBAL VARIABLES) +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.00 sec)