發表文章

目前顯示的是有「MYSQL」標籤的文章

[MYSQL][PHP] 如何不影響使用者操作 完成大資料表的更新

有些資料表需要每日更新,而更新過程需要一段時間,一般的作法是刪掉舊資料,然後寫入新資料,過程中使用者可能會因為舊資料被刪掉又還沒寫入新資料,導致系統產生錯誤。 為了避免發生這種情形,較好的更新資料策略為:

[MYSQL] 最簡單的單筆(或多筆)資料備份語法 (同table或不同table皆可)

單筆: 表A的某筆資料(例如:id=5) 要變動前,希望能先備份到表B,語法如下: INSERT INTO table_b SELECT * FROM table_a WHERE table_a.id = '5' 多筆: 表A的多筆資料(例如:type=1) 要變動前,希望能先備份到表B,語法如下: INSERT INTO table_b SELECT * FROM table_a WHERE table_a.type = '1' 此時table_a只要type是1的資料,不管幾筆都會寫到table_b。 部分欄位修改: 假設我要要將表A中type=1的資料,全部複製一份,且同時改寫部分欄位,語法如下: INSERT INTO table_a (`type`, `name`, `qty`) SELECT 2, `name`, NULL FROM table_a WHERE table_a.type = '1' 此時table_a只要是type是1的資料,會全部複製一份,且type改為2、name維持一樣、qty全部為NULL,新增到資料表上。

[MAC][MYSQL] 如何在MAC上安裝MYSQL (以 MYSQL5.7 為例)

1. 至 MYSQL 官網 下載.dmg 安裝檔 2. 執行安裝程序 最後系統會給一個隨機密碼 先記下來 3. 加環境變數 $export PATH=${PATH}:/usr/local/mysql/bin/ $source ~/.bash_profile 4. 改root密碼 $mysql -h localhost -u root -p 輸入隨機密碼 進入mysql文字操作介面 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('mypassword'); 5. 完成後,就可以用root跟新密碼來登入 phpmyadmin 或 其他DB工具(如:sequel pro)了。

[MYSQL] 建立索引(INDEX)的語法

第一種: CREATE INDEX my_index ON my_table(col_a); 第二種: ALTER TABLE my_table ADD INDEX(col_a); 效果是一樣的,差別在第一種需要幫索引命名,第二種會自動命名。 備註: 建立一個複合索引的語法 ALTER TABLE my_table ADD INDEX(col_a, col_b); 一次建立多個單一索引的語法 ALTER TABLE my_table ADD INDEX(col_a), ADD INDEX(col_b);

[MYSQL] SQL查詢卡住時 如何處理 (使用 show processlist;)

使用下列SQL語法可查出目前卡住的查詢,然後在 phpmyadmin 可以直接 kill show full processlist;

[MYSQL] 如何在 select 時,使用類似 PHP 的 switch 功能

官網介紹   範例1.  SELECT  CASE 1  WHEN 1 THEN 'one' WHEN 2 THEN 'two'  ELSE 'more'  END 範例2.  SELECT  CASE cid  WHEN 'kr' THEN 'Korea' WHEN 'jp' THEN 'Japan'  ELSE 'Taiwan'  END AS country FROM customer 說明:假設客戶資料表只有國家簡碼(cid, eg. jp...),但需求 select 出來時要顯示國家全名。

[PHP][MYSQL] 如何知道SQL連線是否已關閉?(使用 ping() ,以 mysqli 為例)

當程式碼非常複雜時,有時我沒無法確定當下是否仍與SQL保持連線,這時可以透過 ping() 這個方法去測試,使用方法很簡單...

[MYSQL] 找出特定日期的前或後幾周(月、季...等)的日期 (使用 DATE_ADD )

MySQL 真是太貼心了 直接看W3官網介紹 這裡

[PHP][MYSQL] 使用 PDO 在 INSERT 或 UPDATE 時,如何在沒有值時寫入 NULL?

有值就寫值,沒值就寫NULL $sth->execute(array(     'tel' => ($tel?$tel:null) ));

[MYSQL] 如何在 WHERE 中用類似 switch, if 的條件判斷式 (使用 CASE WHEN THEN ELSE END)

假設我們的資料表如下 name class score Allen B 78 Bill A 85 Cindy A 77 Dennis B 74 Ellen C 81 如果我們需要把A班考80分以上、B班考75分以上的學生找出來,只要使用下列語法,就可以簡單達成囉...

[MYSQL][SQLite] MYSQL 的預設時間區是 local timezone 跟 SQLite 則是 GMT

有時候我們會直接用SQL抓當下時間,例如 MYSQL: SELECT NOW();  //顯示2016-12-01 10:00:00 SQLite: SELECT datetime();  //顯示2016-12-01 02:00:00 可以發現兩個相差了八小時,那是因為 SQLite 抓的是 GMT 時間,MYSQL 抓的是 localtime (Asia/Taipei)。 如果要讓 SQLite 抓到 localtime,請使用下面的語法 SELECT datetime('now', 'localtime');  //顯示2016-12-01 10:00:00

[MYSQL] VARCHAT 型態的欄位值 比大小結果不正確的快速解法

假設有兩個欄位 A & B 型態為 VARCHAT,A欄位存 '10'、B欄位存 '3',語法如下: SELECT IF(A > B, 1, 0) AS ans FROM mytable 直覺反應 ans 會是 1,但是結果會是 0。 快速解法如下: SELECT IF((A + 0) > (B + 0), 1, 0) AS ans FROM mytable 透過+0這個動作讓型態轉成數值。

[MYSQL] 查出資料表的基本資料

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'my_db' AND TABLE_NAME = 'my_table'  可以查出很多資訊,如:資料表的建立時間、使用何種ENGINE...等 ( MySQL官網 ) TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT

[SQLite][MYSQL][PHP] 如何在迴圈 快速新增多筆資料 (fast multi insert) (使用Transaction交易模式,多筆query一次commit)

SQLite 有支援一次多筆insert的語法,但時候我們受限於PHP程式而必需在迴圈中一筆一筆的執行 SQL 的 insert,少量資料這樣做是OK的,但當資料筆數過多(例如超過一萬筆),就必需使用一個小技巧,方法很簡單...

[MAC][PHP][Laravel][MYSQL] 如何查看 Homestead 的資料庫 (以 MYSQL 為例,使用 Sequel Pro)

假設 Homestead 已經安裝好,首頁可以正常顯示了。 Step 1. 先安裝一套在MAC環境下免費好用的 MySQL GUI  【 Sequel Pro 】。 Step 2. 啟動後,輸入連線資訊 (預設帳號是 homestead、密碼是 secret、host是192.168.10.10、port是3306)。 (註:Homestead 預設host是 192.168.10.10) Step 3. 左上角 可以選擇要連線的資料庫,這邊選擇 homestead,完成。 註1:如果想要知道 laravel 的DB資訊,可以在專案的根目錄的.env找到。 註2:如果想要改掉homestead這個預設帳號跟密碼,請點選 Sequel Pro 右上角的 "User" 圖示,出現 Accounts 清單後點選 homestead, 然後右邊就可以直接改帳號及密碼,輸入新的帳號跟密碼後,按右下角的Apply,就完成修改了。然後要記得回去改 .env 檔中的 DB_USERNAME 及 DB_PASSWORD。

[MYSQL] 使用 ORDER BY 排序時,讓特定對象排在最上面的方法 (使用 CASE)

uid | joindate A01 | 2015-01-01 A02 | 2016-02-01 A03 | 2016-03-01 我們希望當A02這個User登入時,報表顯示如下 A02 | 2016-02-01 A01 | 2016-01-01 A03 | 2016-03-01 SQL語法如何下呢?...

[MYSQL] INSERT 寫入一筆資料的兩種基本語法

MySQL 官網 基本-語法 1. 單筆: INSERT INTO my_table (col_name1, col_name2,...) VALUES (value1, value2,...) 多筆: INSERT INTO my_table (col_name1, col_name2,...) VALUES (value1, value2,...), (value1, value2,...), ... 基本-語法 2. 單筆: INSERT INTO my_table SET col_name1 = value1, col_name2 = value2,... 進階-語法 3. 複製: INSERT INTO my_table SELECT * FROM other_table WHERE id = '1' 備註: 1. INTO 在 MySQL 3.22.5 之後的版本 可以被省略。 2. 語法2. 在 MySQL 3.22.10 之後的版本 才支援。 3. 語法3. 兩個table欄位必需一致。

[MYSQL][Vim] 如何避免 非中文 (如:日文) 的資料表匯出後,Excel打開會出現亂碼的情形? ( phpmyadmin 匯出) (Notepad++ & Vim)

1. phpmyadmin 匯出時,格式選擇"CSV"。 2. 使用 Notepad++ 開啟 CSV 檔。 3. 編碼 / 轉換至 UTF-8 碼格式。 (目的是為讓CSV檔"加上檔首") 4. 用 Excel 開啟 CSV 檔,搞定。 如果是用Vim編輯器,則可以使用下面三個指令 ( 參考來源 ) 查詢bom :set bomb? 加上bom :set bomb 刪除bom :set nobomb

[MYSQL] 多層式子查詢 效能注意事項

table1 id | no ------- 1 | 001 2 | 002 3 | 003 table2 id | no | user | yn ------------------- 1 | 002 | aaa | y 2 | 002 | bbb | y 3 | 002 | ccc | n 4 | 002 | bbb | y 案例說明: table1 是單據主檔, table2 是單據的簽核記錄,假設 002 這張單據需要 aaa, bbb, ccc 三個人都同意(y),只要其中一個人不同意(n),就要重簽,所以 002 這張單目前簽核同意的人只有 bbb 一個人,我們要怎麼用一個 sql 語法抓出來呢?很簡單...

[MYSQL][好文] MySQL數據類型:SQL_MODE設置不容忽視

圖片
MySQL數據類型:SQL_MODE設置不容忽視  (簡中) 短摘: 1. MySQL官網  說明1 說明2 2. 查詢目前的 sql-mode SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode; 3. 使用 phpmyadmin 查詢 首頁 > 變數 > 搜尋 "sql mode"