MySQL 是最流行的關係型數據庫管理系統,在 WEB 應用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關係數據庫管理系統)應用軟件之一。
-
RDBMS術語
- 數據庫: 數據庫是一些關聯表的集合。
- 數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
- 列: 一列(數據元素) 包含了相同類型的數據, 例如郵政編碼的數據。
- 行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
- 冗餘:存儲兩倍數據,冗餘降低了性能,但提高了數據的安全性。
- 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
- 外鍵:外鍵用於關聯兩個表。
- 複合鍵:複合鍵(組合鍵)將多個列作爲一個索引鍵,一般用於複合索引。
- 索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
- 參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證數據的一致性。
-
管理MySQL的命令
-
USE 數據庫名 :
選擇要操作的Mysql數據庫,使用該命令後所有Mysql命令都只針對該數據庫。mysql> use mysql; Database changed
-
SHOW DATABASES:
列出 MySQL 數據庫管理系統的數據庫列表。mysql> show databases; +--------------------+ | Database | +--------------------+ | django數據庫 | | information_schema | | jdbc_test | | mysql | | performance_schema | | sakila | | sys | | world | | 爬蟲數據庫 | +--------------------+ 12 rows in set (0.01 sec)
-
SHOW TABLES:
顯示指定數據庫的所有表,使用該命令前需要使用 use 命令來選擇要操作的數據庫。mysql> use 爬蟲數據庫; Database changed mysql> show tables; +----------------------+ | Tables_in_爬蟲數據庫 | +----------------------+ | douban | | url_list | +----------------------+ 2 rows in set (0.00 sec)
-
SHOW COLUMNS FROM 數據表:
顯示數據表的屬性,屬性類型,主鍵信息 ,是否爲 NULL,默認值等其他信息。mysql> SHOW COLUMNS FROM douban; +---------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------+------+-----+---------+-------+ | serial_number | varchar(32) | NO | PRI | NULL | | | movie_name | varchar(255) | YES | | NULL | | | introduce | varchar(1000) | YES | | NULL | | | star | varchar(10) | YES | | NULL | | | evaluate | varchar(255) | YES | | NULL | | | describe | varchar(255) | YES | | NULL | | +---------------+---------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
-
SHOW INDEX FROM 數據表:
顯示數據表的詳細索引信息,包括PRIMARY KEY(主鍵)。mysql> SHOW INDEX FROM douban; +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | douban | 0 | PRIMARY | 1 | serial_number | A | 250 | NULL | NULL | | BTREE | | | YES | NULL | +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ 1 row in set (0.01 sec)
-
SHOW TABLE STATUS LIKE [FROM db_name] [LIKE ‘pattern’] \G:
該命令將輸出Mysql數據庫管理系統的性能及統計信息。mysql> SHOW TABLE STATUS FROM 爬蟲數據庫; # 顯示數據庫 爬蟲數據庫 中所有表的信息 +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | douban | InnoDB | 10 | Dynamic | 250 | 393 | 98304 | 0 | 0 | 0 | NULL | 2019-04-28 01:30:48 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | | url_list | InnoDB | 10 | Dynamic | 13 | 1260 | 16384 | 0 | 0 | 0 | 17 | 2019-04-14 16:08:28 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
mysql> SHOW TABLE STATUS FROM 爬蟲數據庫 LIKE 'url%'; # 表名以url開頭的表的信息 +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | url_list | InnoDB | 10 | Dynamic | 13 | 1260 | 16384 | 0 | 0 | 0 | 17 | 2019-04-14 16:08:28 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ 1 row in set (0.00 sec)
mysql> SHOW TABLE STATUS FROM 爬蟲數據庫 LIKE 'url%' \G ; # 加上 \G,查詢結果按列打印 *************************** 1. row *************************** Name: url_list Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 13 Avg_row_length: 1260 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: 17 Create_time: 2019-04-14 16:08:28 Update_time: NULL Check_time: NULL Collation: utf8mb4_0900_ai_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
-
-
MySQL 創建數據庫
-
我們可以在登陸 MySQL 服務後,使用 create 命令創建數據庫,語法如下:
CREATE DATABASE 數據庫名; # 例子: mysql> CREATE DATABASE test; Query OK, 1 row affected (0.01 sec)
-
使用 mysqladmin 創建數據庫
使用普通用戶,你可能需要特定的權限來創建或者刪除 MySQL 數據庫。
所以我們這邊使用root用戶登錄,root用戶擁有最高權限,可以使用 mysql mysqladmin 命令來創建數據庫。
以下命令簡單的演示了創建數據庫的過程,數據名爲 test2:C:\Users\Administrator> mysqladmin -u root -p create test2 Enter password: **** # 進入數據庫 查看是否創建了 test2數據庫 C:\Users\Administrator>mysql -uroot -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 Server version: 8.0.15 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | database | | information_schema | | jdbc_test | | mysql | | performance_schema | | sakila | | sys | | test | | test2 | | world | +--------------------+ 10 rows in set (0.00 sec)
-
-
MySQL 刪除數據庫
-
使用普通用戶登陸 MySQL 服務器,你可能需要特定的權限來創建或者刪除 MySQL 數據庫,所以我們這邊使用 root 用戶登錄,root 用戶擁有最高權限。在刪除數據庫過程中,務必要十分謹慎,因爲在執行刪除命令後,所有數據將會消失。
-
drop 命令刪除數據庫
drop 命令格式:drop database <數據庫名>; # 例如刪除名爲 test1 的數據庫: mysql> drop database test; Query OK, 0 rows affected (0.01 sec)
-
使用 mysqladmin 刪除數據庫
C:\Users\Administrator>mysqladmin -u root -p drop test Enter password: **** Dropping the database is potentially a very bad thing to do. Any data stored in the database will be destroyed. Do you really want to drop the 'test' database [y/N] y Database "test" dropped
-
-
MySQL 數據類型
MySQL中定義數據字段的類型對你數據庫的優化是非常重要的。
MySQL支持多種類型,大致可以分爲三類:數值、日期/時間和字符串(字符)類型。
-
數值類型:
MySQL支持所有標準SQL數值數據類型。 這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。 關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。 BIT數據類型保存位字段值,並且支持MyISAM、MEMORY、InnoDB和BDB表。 作爲SQL標準的擴展,MySQL也支持整數類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個整數類型的存儲和範圍。
-
日期和時間類型:
表示時間值的日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每個時間類型有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。 TIMESTAMP類型有專有的自動更新特性,將在後面描述。
-
字符串類型:
字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。 BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。 也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,並且排序和比較基於列值字節的數值值。 BLOB 是一個二進制大對象,可以容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不同。 有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據實際情況選擇。
-
關於漢字佔多少個字節問題:
MySQL 5.0 以上的版本: 1、一個漢字佔多少長度與編碼有關: UTF-8:一個漢字=3個字節 GBK:一個漢字=2個字節 2、varchar(n) 表示 n 個字符,無論漢字和英文,Mysql 都能存入 n 個字符,僅是實際字節長度有所區別 3、MySQL 檢查長度,可用 SQL 語言來查看: select LENGTH(fieldname) from tablename
-
-
MySQL 創建數據表
創建MySQL數據表需要以下信息: 表名 表字段名 定義每個表字段
-
語法,以下爲創建MySQL數據表的SQL通用語法:
CREATE TABLE table_name (column_name column_type);
以下例子中我們將在 test 數據庫中創建數據表test_tbl:
CREATE TABLE IF NOT EXISTS `test_tbl`( `id` INT UNSIGNED AUTO_INCREMENT, `title` VARCHAR(100) NOT NULL, `author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
實例解析:
如果你不想字段爲 NULL 可以設置字段的屬性爲 NOT NULL, 在操作數據庫時如果輸入該字段的數據爲NULL ,就會報錯。
AUTO_INCREMENT定義列爲自增的屬性,一般用於主鍵,數值會自動加1。
PRIMARY KEY關鍵字用於定義列爲主鍵。 可以使用多列來定義主鍵,列間以逗號分隔。
ENGINE 設置存儲引擎,CHARSET 設置編碼。
-
通過命令提示符創建表:
通過 mysql> 命令窗口可以很簡單的創建MySQL數據表。你可以使用 SQL 語句 CREATE TABLE 來創建數據表。
-
實例
以下爲創建數據表 test_tbl 實例:mysql> use test; Database changed mysql> use test; Database changed mysql> CREATE TABLE `test_tb1`( -> `id` INT UNSIGNED AUTO_INCREMENT, -> `title` VARCHAR(100) NOT NULL, -> `author` VARCHAR(40) NOT NULL, -> `submission_date` DATE, -> PRIMARY KEY(`id`)) ENGINE InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected, 1 warning (0.05 sec)
注意:MySQL命令終止符爲分號 ; 。
注意: -> 是換行符標識,不要複製。
-
PS:
創建 MySql 的表時,表名和字段名外面的符號 ` 不是單引號,而是英文輸入法狀態下的反單引號,也就是鍵盤左上角 esc 按鍵下面的那一個 ~ 按鍵,坑慘了。
反引號是爲了區分 MySql 關鍵字與普通字符而引入的符號,一般的,表名與字段名都使用反引號。
-
-
MySQL 刪除數據表
MySQL中刪除數據表是非常容易操作的, 但是你再進行刪除表操作時要非常小心, 因爲執行刪除命令後所有數據都會消失。
-
語法,以下爲刪除MySQL數據表的通用語法:
DROP TABLE table_name ;
-
在命令提示窗口中刪除數據表:
# 刪除 test 數據庫中的 test_tb1表 mysql> use test; Database changed mysql> DROP TABLE test_tb1; Query OK, 0 rows affected (0.03 sec)
-
執行成功後,我們使用以下命令,就看不到 test_tb1 表了:
mysql> show tables; Empty set (0.01 sec)
-
MySQL 表中使用 INSERT INTO SQL語句來插入數據。
你可以通過 mysql> 命令提示窗口中向數據表中插入數據,或者通過Python腳本來插入數據(關於python腳本後期會寫一篇博客)。
以下爲向MySQL數據表插入數據通用的 INSERT INTO SQL語法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
如果數據是字符型,必須使用單引號或者雙引號,如:“value”。
-
通過命令提示窗口插入數據
以下我們將使用 SQL INSERT INTO 語句向 MySQL 數據表 test_tb1 插入數據:
mysql> use test_tbl; Database changed mysql> INSERT INTO test_tbl -> (title,author,submission_date) -> VALUES ()); -> ("學習Python","松本剛",NOW()); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> INSERT INTO test_tbl -> (title,author,submission_date) -> VALUES -> ("學習Mysql","松本剛",NOW()); Query OK, 1 row affected, 1 warning (0.03 sec)
注意: 使用箭頭標記 -> 不是 SQL 語句的一部分,它僅僅表示一個新行,如果一條SQL語句太長,我們可以通過回車鍵來創建一個新行來編寫 SQL 語句,SQL 語句的命令結束符爲分號 ;。
在以上實例中,我們並沒有提供 id 的數據,因爲該字段我們在創建表的時候已經設置它爲 AUTO_INCREMENT(自動增加) 屬性。 所以,該字段會自動遞增而不需要我們去設置。實例中 NOW() 是一個 MySQL 函數,該函數返回日期和時間。
接下來我們可以通過以下語句查看數據表數據:
mysql> SELECT * FROM test_tbl; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 學習Python | 松本剛 | 2019-09-16 | | 2 | 學習Mysql | 松本剛 | 2019-09-16 | +----+------------+--------+-----------------+ 2 rows in set (0.00 sec)
-
INSERT 插入多條數據
INSERT INTO table_name (field1, field2,...fieldN) VALUES (valueA1,valueA2,...valueAN), (valueB1,valueB2,...valueBN), (valueC1,valueC2,...valueCN)......;
-
添加數據的時候可以規定列進行添加。
如果所有的列都要添加數據可以不規定列進行添加數據:
mysql> INSERT INTO runoob_tbl -> VALUES -> (0, "JAVA 教程", "JAVA.COM", '2019-09-06');
第一列如果沒有設置主鍵自增(PRINARY KEY AUTO_INCREMENT)的話添加第一列數據比較容易錯亂,要不斷的查詢表看數據。
如果添加過主鍵自增(PRINARY KEY AUTO_INCREMENT)第一列在增加數據的時候,可以寫爲0或者null,這樣添加數據可以自增, 從而可以添加全部數據,而不用特意規定那幾列添加數據。
-
MySQL 查詢數據
MySQL 數據庫使用SQL SELECT語句來查詢數據。 你可以通過 mysql> 命令提示窗口中在數據庫中查詢數據,或者通過Python腳本來查詢數據。
語法,以下爲在MySQL數據庫中查詢數據通用的 SELECT 語法:
SELECT column_name,column_name FROM table_name [WHERE Clause] [LIMIT N][ OFFSET M]
查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
SELECT 命令可以讀取一條或者多條記錄。
你可以使用星號(*)來代替其他字段,SELECT語句會返回表的所有字段數據
你可以使用 WHERE 語句來包含任何條件。
你可以使用 LIMIT 屬性來設定返回的記錄數。
你可以通過OFFSET指定SELECT語句開始查詢的數據偏移量。默認情況下偏移量爲0。-
通過命令提示符獲取數據:
以下實例我們將通過 SQL SELECT 命令來獲取 MySQL 數據表 test_tbl 的數據:
mysql> SELECT * FROM test_tbl; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 學習Python | 松本剛 | 2019-09-16 | | 2 | 學習Mysql | 松本剛 | 2019-09-16 | | 3 | 學習php | 大隱 | 2019-09-18 | +----+------------+--------+-----------------+ 3 rows in set (0.00 sec)
-
-
MySQL WHERE 子句
我們知道從 MySQL 表中使用 SQL SELECT 語句來讀取數據。
如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句中。
以下是 SQL SELECT 語句使用 WHERE 子句從數據表中讀取數據的通用語法:
SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....
查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,並使用WHERE語句來設定查詢條件。
你可以在 WHERE 子句中指定任何條件。
你可以使用 AND 或者 OR 指定一個或多個條件。
WHERE 子句也可以運用於 SQL 的 DELETE 或者 UPDATE 命令。
WHERE 子句類似於程序語言中的 if 條件,根據 MySQL 表中的字段值來讀取指定的數據。
-
從命令提示符中讀取數據:
我們將在SQL SELECT語句使用WHERE子句來讀取MySQL數據表 runoob_tbl 中的數據:
實例
以下實例將讀取 test_tbl 表中 author 字段值爲 松本剛 的所有記錄:
SELECT * from test_tbl WHERE author='松本剛'; mysql> SELECT * from test_tbl WHERE author='松本剛'; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 學習Python | 松本剛 | 2019-09-16 | | 2 | 學習Mysql | 松本剛 | 2019-09-16 | +----+------------+--------+-----------------+ 2 rows in set (0.00 sec)
- MySQL 的 WHERE 子句的字符串比較是不區分大小寫的。 你可以使用 BINARY 關鍵字來設定 WHERE 子句的字符串比較是區分大小寫的。
-
MySQL UPDATE 更新
如果我們需要修改或更新 MySQL 中的數據,我們可以使用 SQL UPDATE 命令來操作。
以下是 UPDATE 命令修改 MySQL 數據表數據的通用 SQL 語法:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
你可以同時更新一個或多個字段。
你可以在 WHERE 子句中指定任何條件。
你可以在一個單獨表中同時更新數據。
當你需要更新數據表中指定行的數據時 WHERE 子句是非常有用的。
-
通過命令提示符更新數據
-
以下我們將在 SQL UPDATE 命令使用 WHERE 子句來更新 test_tbl 表中指定的數據:
以下實例將更新數據表中 id 爲 3 的 title 字段值:
mysql> UPDATE test_tbl SET title='學習前端' WHERE id=3; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM test_tbl; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 學習python | 松本剛 | 2019-09-16 | | 2 | 學習Java | 松本剛 | 2019-09-16 | | 3 | 學習前端 | 大隱 | 2019-09-18 | +----+------------+--------+-----------------+ 3 rows in set (0.00 sec)
-
-
MYSQL DELETE 刪除語句
語法:
DELETE FROM table_name [WHERE Clause]
1. 如果沒有指定 WHERE 子句,MySQL 表中的所有記錄將被刪除。 2. 你可以在 WHERE 子句中指定任何條件 3. 您可以在單個表中一次性刪除記錄。 ps:當你想刪除數據表中指定的記錄時 WHERE 子句是非常有用的。
實例:
以下將刪除 test_tbl表中 id=3 的記錄: mysql> DELETE FROM test_tbl WHERE id=3; Query OK, 1 row affected (0.23 sec) mysql> select * from test_tbl; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 學習python | 松本剛 | 2019-09-16 | | 2 | 學習Java | 松本剛 | 2019-09-16 | +----+------------+--------+-----------------+ 2 rows in set (0.00 sec)
筆記:
delete,drop,truncate 都有刪除表的作用,區別在於: 1、delete 和 truncate 僅僅刪除表數據,drop 連表數據和表結構一起刪除,打個比方,delete 是單殺,truncate 是團滅,drop 是把電腦摔了。 2、delete 是 DML 語句,操作完以後如果沒有不想提交事務還可以回滾,truncate 和 drop 是 DDL 語句,操作完馬上生效,不能回滾,打個比方,delete 是發微信說分手,後悔還可以撤回,truncate 和 drop 是直接扇耳光說滾,不能反悔。 3、執行的速度上,drop>truncate>delete,打個比方,drop 是神舟火箭,truncate 是和諧號動車,delete 是自行車。
-
ALTER 命令
當我們需要修改數據表名或者修改數據表字段時,就需要使用到MySQL ALTER命令。 首先創建一張表,表名爲:testalter_tbl mysql> CREATE TABLE testalter_tbl( -> i INT, -> c CHAR(1) -> ); Query OK, 0 rows affected (0.04 sec) mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | i | int(11) | YES | | NULL | | | c | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
-
刪除,添加或修改表字段:
如下命令使用了 ALTER 命令及 DROP 子句來刪除以上創建表的 i 字段: mysql> ALTER TABLE testalter_tbl DROP i; Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0
如果數據表中只剩餘一個字段則無法使用DROP來刪除字段。
MySQL 中使用 ADD 子句來向數據表中添加列,如下實例在表 testalter_tbl 中添加 i 字段,並定義數據類型: mysql> ALTER TABLE testalter_tbl ADD i INT; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
執行以上命令後,i 字段會自動添加到數據表字段的末尾。
mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
如果你需要指定新增字段的位置,可以使用MySQL提供的關鍵字 FIRST (設定位第一列), AFTER 字段名(設定位於某個字段之後)。
嘗試以下 ALTER TABLE 語句, 在執行成功後,使用 SHOW COLUMNS 查看錶結構的變化:
ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT FIRST; ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT AFTER c;
-
修改字段類型及名稱:
如果需要修改字段類型及名稱, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
例如,把字段 c 的類型從 CHAR(1) 改爲 CHAR(10),可以執行以下命令:
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10); Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0
使用 CHANGE 子句, 語法有很大的不同。 在 CHANGE 關鍵字之後,緊跟着的是你要修改的字段名,然後指定新字段名及類型。嘗試如下實例:
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT; Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM testalter_tbl; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | j | bigint(20) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
-
ALTER TABLE 對 Null 值和默認值的影響:
mysql> ALTER TABLE testalter_tbl CHANGE j i INT NOT NULL DEFAULT 1000; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM testalter_tbl; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | i | int(11) | NO | | 1000 | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) 如果你不設置默認值,MySQL會自動設置該字段默認爲 NULL。
-
修改字段默認值:
你可以使用 ALTER 來修改字段的默認值,嘗試以下實例:
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 100; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM testalter_tbl; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | i | int(11) | NO | | 100 | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.01 sec)
你也可以使用 ALTER 命令及 DROP子句來刪除字段的默認值,如下實例:
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM testalter_tbl; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | i | int(11) | NO | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
-
修改數據表類型,可以使用 ALTER 命令及 TYPE 子句來完成。嘗試以下實例,我們將表 testalter_tbl 的類型修改爲 MYISAM :
注意:查看數據表類型可以使用 SHOW TABLE STATUS 語句。
mysql> ALTER TABLE testalter_tbl ENGINE= MYISAM; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW TABLE STATUS LIKE 'testalter_tbl' \G; *************************** 1. row *************************** Name: testalter_tbl Engine: MyISAM Version: 10 Row_format: Fixed Rows: 0 Avg_row_length: 0 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2019-10-10 19:59:37 Update_time: NULL Check_time: NULL Collation: utf8mb4_0900_ai_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
-
修改表名:
如果需要修改數據表的名稱,可以在 ALTER TABLE 語句中使用 RENAME 子句來實現。
嘗試以下實例將數據表 testalter_tbl 重命名爲 alter_tbl:
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl; Query OK, 0 rows affected (0.01 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | alter_tbl | | test_tbl | +----------------+ 2 rows in set (0.00 sec)
-
end…