1. 程式人生 > 實用技巧 >MySQL基礎之MySQL必知必會(二十一)建立和操縱表

MySQL基礎之MySQL必知必會(二十一)建立和操縱表

建立表

一般有兩種建立表的方法:

  • 使用具有互動式建立和管理表的工具
  • 表也可以直接用MySQL語句操縱

為了用程式建立表, 可使用SQL的CREATE TABLE語句。

表建立基礎

為利用CREATE TABLE建立表, 必須給出以下資訊

  • 新表的名字, 在關鍵字CERATE TABLE之後給出
  • 表列的名字和定義, 用逗號隔開

CREATE TABLE語句也可能會包括其他關鍵字或選項, 但至少要包括表的名字和列的細節

MariaDB [crashcourse]> CREATE TABLE customers
(
    cust_id         int            NOT
NULL 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_email
char(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;