Jose M. Fernández 內容目錄: 簡介 主要特性 安裝 第一步, 系統管理 (安全性) 在 MySQL 下使用 SQL 語言 結論 與作者聯繫 |
MySQL
|
Tables |
---|
db |
host |
user |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
Db | char(32) | PRI | |||
User | char(16) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
Db | char(32) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
User | char(16) | PRI | |||
Password | char(16) | ||||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N | |||
Reload_priv | char(1) | N | |||
Shutdown_priv | char(1) | N | |||
Process_priv | char(1) | N | |||
File_priv | char(1) | N |
你可以藉更改這些表格賦與使用者對某一個表格進行選出 (SELECT)、 插入 (INSERT)、 更新 (UPDATE) 或 刪除 (DELETE) 等動作的權限。
也能在此設定允不允許建立 (CREATE)、刪除 (DROP) 表格或資料庫。
另外有趣的是,你還可以設定使用 shutdown、 reload、process 等系統指令的權限。
此外,可以用 mysqlaccess 這個命令手稿 (script) 來檢視系統目前的各種權限設定。
在設定權限時,主機 (HOST) 必須是 host local 、IP 位址 或是一個 SQL 表示式 (expression)。假如在表格 db 裡面 "host" 欄位是空的, 這表示是 host 表格裡面的 any host;相對的,假如在表格 host 或 user 裡面的 "host" 欄位是空的, 就代表了任何能與本伺服器建立 TCP 連線的主機。
"Db" 是此資料庫的名稱。
一個空白的 USER 欄位代表任何的使用者。
啟動 MySQL 伺服軟體最快的方法就是執行以下指令:
mysql.server start如同在 MySQL 的安裝指南中提到的, 以上的動作都可以藉命令手稿 safe_mysql 來達成,不過不管如何,結果都是會執行 mysqld 這個背景程式 (deamon)。
我們很容易可以理解,必須要啟動資料庫伺服程式來對資料庫進行所有的操作; 當伺服程式在背景執行的時候,我們才可以進行 "mysqladmin" 裡的操作 ,mysqladmin 的語法如下:
mysqladmin [OPTIONS] command command選項 OPTIONS 可以是:
而 command 可以是一個或多個的下列指令:
舉例來講,執行:
mysqladmin create newdatabase會新建一個名為 "newdatabase" 的資料庫。
要列出正在這台伺服器上跑的所有程序,可以:
mysqladmin processlist還有一個重要的指令是 "mysqlshow",它可以顯示目前所有的資料庫, 舉例 而言,不加任何參數執行 mysqlshow 的話:
> mysqlshow+-----------+ | Databases | +-----------+ | mysql | | people | | test | +-----------+
我們在緒論裡面已經指出 MySQL 這套 SQL 伺服軟體被認為是同等級的軟體 裡面速度最快的一個,同時也提到性能表現好的代價就是未能提供一些我個 人認為很重要的 SQL 特性,其中兩個未提供的重要特性就是觸發器 (Triggers) 與異動邏輯 (Transactional Logic)。
所謂的觸發器其實只是一小段程式碼,這段程式碼在資料庫被施以某特定動 作 (如更新、刪除等等) 時就會被 "觸發" --執行--,系統顯然要消耗額外 的資源來測試觸發器被觸發的條件以及管理這些觸發器,這就是 MySQL 並不 提供觸發器的唯一原因。
在關連性資料庫裡面, 各個表格 (table) 之間必須保持一致性, 是非常重要的, SQL 提供了一個簡單的機制, 來保證這樣的一致性: 「異動邏輯」, 伺服軟體不但要提供機制來鎖定 (blocking) 檔案, 而且要統一對資料庫的操作, 並在某個指令操作完以後, 還能夠退回未下指令之前的狀態; 好啦, MySQL 為了改善處理的速度, 所以並未提供異動邏輯 (至少文件上是這麼說的), 我們唯一自助的方法, 就是在更動資料庫之前用 LOCK tables/UNLOCK tables 這些指令, 來鎖定檔案不讓其他使用者來使用, 不過, 還是沒辦法移除已經對資料施行的操作。
腦子裡面考慮清楚這套伺服軟體的限制以後, 接著該來複習幾個 SQL 指令囉, 這一段的目地, 不是要來跟大家分析研究 SQL 指令, 只是要讓大家看看這伺服軟體, 是如何提供這些指令而已。
在啟動伺服軟體以後, 就完成送出指令的準備了。 現在, 讓我們來建立一個名字叫作 "people"、 裡面含有 "clients"、 "states"、 "counties" 三個表格的資料庫, 這是一個很簡單, 而且不太實用的範例, 不過, 已足以讓我們瞭解, 要如何處理在真實世界裡面的資料。 首先必須說明一下, 其實這幾個動作, 可以用很多方法來達成: 你可以利用 MySQL 提供的應用程式介面 (API) ,撰寫 C、 C++ 或 JAVA 程式, 在 Windows95 底下工作的人可以透過 ODBC 介面和 MySQL 溝通 (大家再原諒我一次),或者也可以使用 MySQL 提供的命令殼 (shell) 來操作。接下來我將 會選擇用最後一個方法來示範操作,因為對這 篇文章的目地而言,使用命令 殼來操作資料庫已經夠強了,也可以避免要去 描述其它程式語言的特性。
可以執行下面指令來啟動 Mysql 的命令殼:
mysql databasename下完指令後就會進到 MySQL 命令殼的提示符號下, 就可以開始送指令給伺服軟體了。
此外也可以用命令殼的批次模式來執行指令:
mysql -e (SQL command )databasename上面的指令會把 SQL 指令直接送給伺服軟體,不會進入命令殼的提示符號。
在我們的範例裡面, 要先建立一個資料庫 "people", 所以我們要先執行下面指令:
mysqladmin create people接著再執行 MySQL 命令殼:
mysql people現在我們可以開始在命令殼裡面, 把指令送給適當的伺服軟體了, 例如可以用下面指令, 看看這個資料庫裡面有哪些表格:
> show tables /g系統的回應是:
+-------------+ | Tables | +-------------+ | clients | | counties | | states | +-------------+
所有由命令殼送到伺服軟體的指令都要以 /g 結尾, 用來告訴系統指令結束, 可以送到伺服器端去執行了。
在你的系統上面, 可能無法得到如上所述的系統回應, 當然啦, 想要得到如此回應的話, 就必須先用 CREATE 指令, 來建立相應的表格才行, 你可以用下面這幾個典型的 CREATE 指令, 建立這三個表格:
CREATE TABLE clients
CREATE TABLE states
CREATE TABLE counties (Cod_state INT(2) NOT NULL, Cod_county INT(3) NOT NULL, Description_c CHAR(30) NOT NULL, PRIMARY KEY(Cod_state,Cod_county)) /g
接著, 可以在建立好表格之後, 執行下面指令:
> show colums from clients from people /g我們將會得到:
Database: people Table: clients Rows: 4 +--------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------+------+-----+---------+-------+ | NIF | char(9) | |PRI | | | | Name | char(15) | YES | | | | | Family_name | char(35) | | | | | | Address | char(50) | | | | | | City | int(5) | | | 0 | | | State | int(2) | | | 0 | | | Phone | int(9) | YES | | | | | Date | date | YES | | | | +--------------+----------+------+-----+---------+-------+
Database: people Table: states Rows: 3 +-----------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key| Default | Extra | +-----------------+----------+------+-----+---------+-------+ | Cod_state | int(2) | | PRI | 0 | | | Descripcion_s | char(30) | | | | | +-----------------+----------+------+-----+---------+-------+
Database: people Table: counties Rows: 9 +------------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key| Default | Extra | +------------------+----------+------+-----+---------+-------+ | Cod_state | int(2) | | PRI | 0 | | | Cod_county | int(3) | | PRI | 0 | | | Descripcion_c | char(30) | | | | | +------------------+----------+------+-----+---------+-------+
接下來要進行的是, 在每個表格裡面插入 (insert) 資料; 讓我們用 INSERT 這個 SQL 指令來達成工作, 毋須使用到其他程式語言, 或任何應用程式介面程序 (API routine):
以下列指令在 "clients"、"counties" 以及 "states" 這三個表格裡, 各插入一筆資料:
最後作一個總結, 用 SQL 指令, 將剛剛插入資料庫表格裡面的資料行, 選擇 (select) 出來, 讓我們先從 "counties" 這個表格選出 Cod_state 為 28 的紀錄, 再依不同的選取條件從 "clients" 裡面, 選出想要的紀錄:
> SELECT ALL Cod_state, Cod_county, Description_c from counties where Cod_state = 28 /gCod_state Cod_county Description_c 28 1 Fuenlabrada 28 2 Pozuelo 28 3 Madrid> SELECT ALL NIF,Name,Family_name,Address from clientes where City = 28001
NIF Name Family_name Address 23198623N JUAN ANDRES RUIZ MORALES C/ CATEDRAL 12 2B 5316828K PEDRO ROMERO DIAZ C/ HOLA 9 52312844J LUIS ALBERTO LISTO JIMENEZ C/ ROSA DE LOS VIENTOS 129 3I
我們在一開頭, 已經說明了這份文件的目標, 是在於展示某個特定 SQL 伺服軟體 (MySQL) 的基本特性, 我們並不想要把這份文件縮水為 MySQL 的使用步驟及指令列表, 取而代之的是, 我們希望在這裡, 研究一下這套軟體的可能性與限制所在; 只有像如此深入的瞭解一套軟體, 才能夠真正的獲得這套軟體提供的巨大好處, MySQL 省略了提供觸發器以及異動邏輯, 因而使得資料的管理 (插入、修改、刪除紀錄) 在多使用者的應用程式, 以及使用到許多個相互關連的表格時, 變得非常複雜。 雖然如此, 在應用到需要對大型資料庫作快速存取的時候, 我會推荐使用這套軟體。
最後我很樂意告訴大家, 這份文件裡面大部份的資料, 都可以在包含於 MySQL 套件裡面的文件中找到, 另外一部分, 則是我在幾篇技術性雜誌的文章, 還有一本已經發黃的 IBM 關於 SQL 的手冊裡面看來的。
主網站由 Miguel Angel Sepulveda 維護 © Jose M. Fernández 1998 LinuxFocus 1998 |