MySQL基礎之MySQL必知必會(二十一)建立和操縱表
建立表
一般有兩種建立表的方法:
- 使用具有互動式建立和管理表的工具
- 表也可以直接用MySQL語句操縱
為了用程式建立表, 可使用SQL的CREATE TABLE語句。
表建立基礎
為利用CREATE TABLE建立表, 必須給出以下資訊
- 新表的名字, 在關鍵字CERATE TABLE之後給出
- 表列的名字和定義, 用逗號隔開
CREATE TABLE語句也可能會包括其他關鍵字或選項, 但至少要包括表的名字和列的細節
MariaDB [crashcourse]> CREATE TABLE customers ( cust_id int NOTNULL AUTO_INCREMENT, cust_name char(50) NOT NULL, cust_address char(50) NULL, cust_city char(50) NULL, cust_state char(5) NULL, cust_zip char(10) NULL, cust_country char(50) NULL, cust_contact char(50) NULL, cust_emailchar(255) NULL, PRIMARY KEY (cust_id) )ENGINE=InnoDB;
使用NULL值
NULL就是沒有值或缺值。允許NULL值的列也允許在插入行時不給出該列的值。不允許NULL值的列不接受該列沒有值的行, 換句話說, 在插入或更新行時, 該列必須有值。
不要把NULL值與空串相混淆。NULL值是沒有值, 它不是空串。如果指定' '(兩個單引號, 期間沒有字元), 這在NOT NULL列中是允許的。空串是一個有效的值, 它不是無值。NULL值用關鍵字NULL而不是空串指定。
主鍵再介紹
主鍵值必須是唯一的。即, 表中的每個行必須具有唯一的主鍵值。如果主鍵使用單個列, 則它的值必須唯一。如果使用多個列, 則這些列的組合值必須唯一。
為建立由多個列組成的主鍵, 應該以逗號分割的列表給出各列名。
MariaDB [crashcourse]> CREATE TABLE orderitems ( order_num int NOT NULL, order_item int NOT NULL, prod_id char(10) NOT NULL, quantity int NOT NULL, item_price decimal(8, 2) NOT NULL, PRIMARY KEY (order_num, order_item) )ENGINE=InnoDB;
使用AUTO_INCREMENT
AUTO_INCREMENT告訴MySQL, 本列每當增加一行時自動增量。每次執行一個INSERT操作時, MySQL自動對該列增量, 給該列賦予下一個可用的值。這樣給每個行分配一個唯一的id, 從而可以用作主鍵值。
每個表只允許一個AUTO_INCREMENT列, 而且它必須被索引。
指定預設值
如果在插入行時沒有給出值, MySQL允許指定此時使用預設值。預設值用CREATE TABLE語句的列定義中的DEFAULT關鍵字指定。
MariaDB [crashcourse]> CREATE TABLE orderitems ( order_num int NOT NULL, order_item int NOT NULL, prod_id char(10) NOT NULL, quantity int NOT NULL DEFAULT 1, item_price decimal(8, 2) NOT NULL, PRIMARY KEY (order_num, order_item) )ENGINE=InnoDB;
MySQL不允許使用函式作為預設值, 它只支援常量
引擎型別
與其他DBMS一樣, MySQL有一個具體管理和處理資料的內部引擎。在使用CREATE TABLE語句時, 該引擎具體建立表, 而在使用SELECT 語句或進行其他資料庫處理時, 該引擎在內部處理請求。
但是不一樣的是, 它具有多種引擎。它打包多個引擎, 這些引擎都隱藏在MySQL伺服器內, 全都能執行CREATE TABLE和SELECT命令。
為什麼要發行多種引擎?
因為它們各自不同的功能和特性, 為不同的任務選擇正確的引擎能獲得良好的功能和靈活性
常見的引擎有:
- InnoDB是一個可靠的事務處理引擎, 它不支援全文字搜尋
- MEMORY在功能上等同於MyISAM, 但由於資料儲存在記憶體中, 速度很快(特別適合於臨時表)
- MyISAM是一個性能極高的引擎, 它支援全文字搜尋, 但不支援事務處理
更新表
為更新表定義, 可使用ALTER TABLE語句。但是理想狀態下, 當表中儲存資料以後, 該表就不應該再被更新。
為了使用ALTER TABLE更改表結構, 必須給出以下資訊
- 在ALTER TABLE之後給出要更改的表名(該表名必須存在, 否則會出錯)
- 所做更改的列
新增列
MariaDB [crashcourse]> ALTER TABLE vendors ADD vend_phone CHAR(20);Query OK, 0 rows affected (0.027 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [crashcourse]>
刪除列
MariaDB [crashcourse]> ALTER TABLE vendors DROP COLUMN vend_phone; Query OK, 0 rows affected (0.030 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [crashcourse]>
複雜的表結構更改一般需要手動刪除過程, 它涉及以下步驟
- 用新的列布局建立一個新表
- 使用INSERT SELECT語句從舊錶複製資料到新表。如果有必要, 可使用轉換函式和計算欄位
- 檢驗包含所需資料的新表
- 重新命名舊錶
- 用舊錶原來的名字重新命名新表
- 根據需要, 重新建立觸發器、儲存過程、索引和外來鍵
刪除表
刪除表(刪除整個表而不是其內容)非常簡單, 使用DROP TABLE語句即可。
MariaDB [crashcourse]> DROP TABLE customers2;
重命名錶
使用RENAME TABLE語句可以重新命名一個表
MariaDB [crashcourse]> RENAME TABLE customer2 TO customer;