# Sequel Ace 資料庫使用
## 關於這篇文章的動機
天底下有好多種操作資料庫介面(可以這樣稱呼他們吧
過去工作短暫使用過 Sequel Ace 但馬馬虎虎
今天這幾天課堂講師提到 用 Java 來連 MySQL
所以決定來 摸索摸索 Sequel Ace
(這是一個偷懶模式的紀錄)
## Sequel Ace 基本介面操作
> Sequel Ace 是一個 MySQL/MariaDB 數據庫管理工具,能夠在圖形用戶界面中管理數據庫
[使用資料為louis老師提供](https://hackmd.io/VLP1gsRMQaOE08YDHnpL0A#Louis-%E8%80%81%E5%B8%AB%E7%B5%A6%E7%9A%84-SQL-%E8%B3%87%E6%96%99%E7%AF%84%E6%9C%AC)
在按鈕 `查詢` 處 進入空白區
可使用SQL語法來建立資料表以及資料內容
`執行` 沒有圖像可以按 鍵盤組合鍵 `command + R` 讓它 Run 起來
![截圖 2023-12-12 下午10.33.50](https://hackmd.io/_uploads/SkK8ylLLT.png)
(上圖程式碼為建立資料表以及欄位設定)
執行後就蓋出資料表啦~點一下左邊資料夾
就可以使用上方其他圖像按鈕來看看結構或是內容等等
![截圖 2023-12-12 下午10.55.55](https://hackmd.io/_uploads/SyLYEgLIa.png)
現在只有資料表 欄位 ,資料內容還沒有給他,所以是空的
![截圖 2023-12-12 下午11.18.04](https://hackmd.io/_uploads/ryLhYl8Ia.png)
這裡給他一些資料,執行 鍵盤組合鍵 `command + R`
![截圖 2023-12-12 下午11.19.22](https://hackmd.io/_uploads/HJL-ql8Up.png)
(這裡欄位跟資料要符合數量,就是有幾個欄位就要塞幾個資料)
如果點選內容還沒有東西,不妨按一下左下角的 `逆時針箭頭` 更新一下
![截圖 2023-12-12 下午11.19.02](https://hackmd.io/_uploads/H1ZecgLUT.png)
接下來需要處理一下`id`欄位這個玩意兒
### (Primary Key)
> 目的是為該表添加主鍵(Primary Key)約束。
>
> 具體來說,ADD PRIMARY KEY 的部分表示將一個主鍵約束添加到指定的欄位上。在這個情境中,主鍵約束被添加到 websites 表的 id 欄位上。
>
> 主鍵是一種用於唯一標識表中每一行的特殊欄位。在這個情境中,id 欄位被指定為主鍵,這意味著 id 欄位中的每個值都應該是唯一的,並且不能為 NULL。
>
> 主鍵的主要作用是確保表中的每一行都可以被唯一識別,這對於建立關聯表之間的關係非常重要。例如,如果 websites 表是一個存儲網站信息的表,那麼每個網站的 id 將是唯一的,並且可以被用作表中每一行的標識符。
>
> 簡而言之,執行這條 SQL 語句的目的是確保 websites 表中的 id 欄位擁有唯一性,這有助於確保表中的每一行都可以被明確地標識。
>
![截圖 2023-12-13 上午11.51.43](https://hackmd.io/_uploads/S1sI5iU8T.png)
可以看到下面執行後出現的變化
`id` key是 PRI
![截圖 2023-12-13 上午11.52.00](https://hackmd.io/_uploads/Sy7ljiIIa.png)
## SQL語法
涉世未深的我,以為需要存檔(是肌肉記憶吧)
編寫玩不自覺想存擋,但其實 SQL 並不需要額外存檔。
> 根據資料顯示,Sequel Ace等大多數 SQL 工具都允許即時執行 SQL 語句而不保存到檔案中
> - 查看執行結果: Sequel Ace 將會顯示 SQL 語句的執行結果。將會在結果面板中查看查詢的結果集或執行狀態。
> - 不需要保存: SQL 語句只是在查詢標籤中的暫時性工作。
>
> 當然,如果你希望將你的 SQL 語句保存起來以便以後使用,你可以選擇 "File" 菜單中的 "Save" 選項,然後選擇一個目錄和文件名稱進行保存。這樣你就能夠在需要的時候重新打開這個文件。
總之,SQL 語句的存檔與否取決於你的需求,而 Sequel Ace 等 SQL 工具通常支持即時執行而不保存。
---
```sql=
ALTER TABLE `websites`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;
COMMIT;
```
`ALTER TABLE` : 這是修改資料表結構的 SQL 命令。
websites: 指定要修改的目標資料表,這裡是 websites。(當初建立命名的,建立時可以自行取名)
`MODIFY`: 指定要修改的動作,這裡是修改資料表中的`某個欄位`。 MODIFY 本身單字意義就是調整
id: 要被修改的欄位名稱。
int(11): 指定 id 欄位的資料類型,這裡是整數,11 是顯示寬度。
NOT NULL: 要求 id 欄位的值不能為 NULL,確保每一行都有一個有效的 id。
`AUTO_INCREMENT`: 指示 id 欄位是一個自動增量(Auto Increment)欄位,即資料庫會自動為每次插入的新數據生成一個唯一的 id 值。
AUTO_INCREMENT=10: 設定自動增量的初始值。在這裡,它被設置為 10,這意味著下一個插入的數據將具有 id 值為 10。
COMMIT: 這個語句是提交(Commit)事務的命令。在這裡,它表明對 websites 資料表的修改被永久性地應用。
> 在上述的 SQL 程式碼中,COMMIT 是 SQL 語句,而不是 Git 的 commit。在 SQL 中,COMMIT 用於提交(commit)當前的事務,確保所有的修改被永久性地應用到資料庫。
>
> 在資料庫中,事務是一系列的 SQL 指令,它們作為一個單一的工作單位執行。COMMIT 語句用於確認這個工作單位的所有修改,使其永久生效。如果沒有 COMMIT,事務所做的修改可能會被回滾(Rollback)到事務開始之前的狀態。
總的來說,這段程式碼的目的是對 websites 資料表中的 id 欄位進行修改,確保它是一個整數、非空的自動增量欄位,並且起始值為 10。
總而言之,就是讓他的`id`自動配給
下面是從 10 改成 30 效果
### 遇到問題!AUTO_INCREMENT 沒效果
其中遇到鬼打牆的事情
簡而言之,過程中莫名其妙的失敗(後來發現很奇
```sql=
ALTER TABLE `websites`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;
COMMIT;
```
我則是需要`commit` 緊跟在前一行後面就可以成功
```sql=
ALTER TABLE `websites`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;COMMIT;
```
快速說明遇到問題
新增資料後想要處理 id 執行了
```sql
ALTER TABLE `websites`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;
COMMIT;
```
沒想到後面如果新增,還是五5 6 7 8跑資料 不是我要的從10開始
結果我把commit 緊跟著上一行後 就可以成功變成從 10 開始
我以為就是要這樣操作,但我把數字拉開大一點,就可以正常從指定點新增
不知道是我冤望路 還是我還沒開竅
```sql
ALTER TABLE `websites`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=30;
COMMIT;
```
總之最後把`commit` 貼緊就會效果暢通啦,如下圖 我要 10 或 30 都沒問題
![截圖 2023-12-13 下午4.12.33](https://hackmd.io/_uploads/ByRXaVPLp.png)
再來就是看看跟編輯器的連結
有效果超開心 T__T
![截圖 2023-12-14 上午2.27.56](https://hackmd.io/_uploads/ryY3PuPLa.png)
![截圖 2023-12-14 上午2.28.38](https://hackmd.io/_uploads/HJX1ddP8a.png)
## 整理幾個學習重點
1. SQL 忘記密碼操作 透過終端機處理
在 console 切去 SQL
這裡打算額外開一篇
2. Sequel Ace 基本操作
今天感覺使用已足夠:)
之後有摸索其他再來開一篇
3. SQL 資料表建立語法(同時建立欄位)
```sql=
CREATE TABLE `websites` (
`id` int(11) NOT NULL,
`name` char(20) NOT NULL DEFAULT '' COMMENT 'site',
`url` varchar(255) NOT NULL DEFAULT '',
`alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名',
`country` char(10) NOT NULL DEFAULT '' COMMENT '國家名稱'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
4. SQL 資料內容
```SQL=
INSERT INTO `websites` (`id`, `name`, `url`, `alexa`, `country`) VALUES
(1, 'Google', 'https://www.google.com/', 1, 'USA'),
(2, 'yahoo', 'https://tw.yahoo.com/', 2, 'TW'),
(3, 'Pchome', 'http://www.pchome.com.tw', 3, 'TW'),
(4, 'Facebook', 'https://www.facebook.com/', 4, 'USA');
```
5. SQL 設定`PRI key`
```SQL=
ALTER TABLE `websites`
ADD PRIMARY KEY (`id`);
```
6. SQL `id` 起始值 & SQL 修改後commit
通常是遞增()???????????
```sql=
ALTER TABLE `websites`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;
COMMIT;
```
這裡除了修改 `id` 空間長度,還設定了遞增起頭 AUTO_INCREMENT=10;
這裡開始新增的資料就會從 10 開始遞增`id`,修改需要特別`COMMIT` !
7. SQL 新增資料(可以跟第四點比較一下,省去寫 id ,因為已經有設定好 AUTO_INCREMENT)
```sql=
INSERT INTO `websites` (`name`, `url`, `alexa`, `country`) VALUES
('Google', 'https://www.google.com/', 1, 'USA');
```
8. Java 連接 SQL 基本code
```java=
import java.sql.*;
public class Mysql_conn {
// // MySQL 8.0 以下版本 - JDBC driver
// static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
// static final String DB_URL = "jdbc:mysql://localhost:3306/louis";
// MySQL 8.0 以上版本 - JDBC driver URL
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/javadb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
static final String USER = "root";
static final String PASS = "0000";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("連接資料庫...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
System.out.println(" Statement 物件...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, name, url FROM websites";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String url = rs.getString("url");
System.out.print("ID: " + id);
System.out.print(", site name: " + name);
System.out.print(", site URL: " + url);
System.out.print("\n");
}
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// JDBC Exception
se.printStackTrace();
}catch(Exception e){
// Class.forName Exception
e.printStackTrace();
}finally{
// 收尾動作,釋放資源
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("End~~~~!");
}
}
```