# 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~~~~!"); } } ```