大部分軟體開發者都至少會使用過一種以上的資料庫系統,我們在程式內寫判斷式時,如果運算子是使用「不等於(Not equal)」時,通常都是用 !=
表示。在 SQL 中雖然也可以使用 !=
表示,但實際上 ANSI SQL-92 標準中使用的是以 <>
表示。
Read more “SQL 語法中的「不等於」應使用「<>」還是「!=」?”
Leave a comment大部分軟體開發者都至少會使用過一種以上的資料庫系統,我們在程式內寫判斷式時,如果運算子是使用「不等於(Not equal)」時,通常都是用 !=
表示。在 SQL 中雖然也可以使用 !=
表示,但實際上 ANSI SQL-92 標準中使用的是以 <>
表示。
Read more “SQL 語法中的「不等於」應使用「<>」還是「!=」?”
Leave a comment建立帳號,其中「myaccount」是帳號,「mypassword」是密碼,主機為 localhost。
CREATE USER 'myaccount'@'localhost' IDENTIFIED BY 'mypassword';
權限設定的指令結構如下(MariaDB 10.2):
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [IDENTIFIED [BY [PASSWORD] 'password']
|{VIA|WITH} plugin_name
[{USING|AS} 'plugin_option']]
[, user [IDENTIFIED [BY [PASSWORD] 'password']
|{VIA|WITH} plugin_name]
[{USING|AS} 'plugin_option']]
user_options...
GRANT PROXY ON user_specification
TO user_specification [, user_specification] ...
[WITH GRANT OPTION]
user_options:
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH with_option [with_option] ...]
object_type:
TABLE
| FUNCTION
| PROCEDURE
priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
| MAX_STATEMENT_TIME time
tls_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
Read more “[MariaDB/MySQL] 建立連線帳號與指派權限”
Leave a comment一般情況下,我們可以很簡單的利用 Limit
語法在進行資料異動中限制影響範圍。
UPDATE my_table
SET my_col
= 'data' LIMIT 2;
但是涉及使用子查詢的情境時,這招便不管用了。
例如今天資料長這樣:
+--------+--------+
| number | my_col |
+--------+--------+
| 1 | a |
| 1 | a |
| 2 | b |
| 2 | b |
| 3 | c |
| 3 | c |
+--------+--------+
我想要更新前面兩種資料,也就是要下 Limit 2
,但是 number 一樣的話就要一起更新,所以 number 為 1 和 2 的資料應該都要 update,所以預期應該要有 4 筆記錄被更新。第一直覺是利用 子查詢應該可以做到:
UPDATE my_table
SET my_col
= 'data' WHERE number
IN (
SELECT DISTINCT number
FROM my_table
LIMIT 2
);
但是如果在 MariaDB/MySQL 5.5 或之後的版本執行時應該會得到 [Err] 1235 - This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
。
那這樣要怎麼辦呢?工具是死的,人是活的,StackOverflow 就有人想到辦法繞過去了。我們把 Limit
語法放到第三層子查詢(子查詢中的子查詢)就好了!
UPDATE my_table
SET my_col
= 'data' WHERE number
IN (
SELECT number
FROM (
SELECT DISTINCT number
FROM my_table
LIMIT 2
) as sub_query_2
);
Leave a comment
今天在匯入資料庫時出現錯誤,導致匯入中斷
ERROR 1118 (42000) at line 437: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
造成的主因是設定檔中啟用了 innodb_strict_mode。
在 MariaDB 10.2.2,或是 MySQL 5.7.7 以上的版本預設會開啟,這裡使用的伺服器是 MariaDB 10.2.8,所以在匯入的 SQL 檔單中有單行超過 8126 個字元的話,在 innodb_strict_mode
開啟的情況下會觸發錯誤,並中斷執行。
一般情況下建議是開啟的,因為相較之下 run-time error 會更頭痛,不過這裡只是單純要匯入資料,所以暫時先關閉後再開啟。
編輯 /etc/mysql/my.cnf
,並將 innodb_strict_mode
設為 0,重新啟動服務後即可。
References:
備份資料庫其中一種方式是使用 mysqldump
指令,例如我要備份一個名為db1的資料庫:
mysqldump -u admin -p db1
# 參數說明
# -u: 使用者名稱
# -p: 密碼,指令enter後會要求輸入密碼,也可以直接將密碼連接在後面,如密碼為123456的話,參數改成 '-p123456' 後指令會直接執行,不會再次要求輸入密碼
若只要備份特定的資料表時,有三種方式
--ignore-table
去排除,需完整名稱 (即 database.table);多個 table 無法使用逗點 (comma) 串接,需個別指定。適用於排除少數資料表mysqldump -u root -p123456 myDB --ignore-table=myDB.logs --ignore-table=myDB.users > dump.sql
mysqldump -u root -p123456 myDB table_1 table_2 table_3 > dump.sql
mysqldump
,適用於資料表數量眾多,需匯出指定資料表也較多的資料庫。mysqldump -u root -p123456 myDB $(mysql -u root -p123456 myDB -Bse SHOW TABLES LIKE 'my_table_%') > dump.sql
一般情況下用 LIKE
語法就夠了,若情況特殊,用 REGEXP
語法去撈也是可行的,需注意 WHERE
的欄位是
。
Tables_in_資料庫名稱