2015-02-03
Fast Bulk Inserts into SQLite
Fast Bulk Inserts into SQLite
http://blog.quibb.org/2010/08/fast-bulk-inserts-into-sqlite/
Finding Duplicates with SQL
SELECT email, COUNT(email) AS NumOccurrences FROM users GROUP BY email HAVING ( COUNT(email) > 1 )
Finding rows that occur exactly once
SELECT email FROM users GROUP BY email HAVING ( COUNT(email) = 1 )
http://blog.quibb.org/2010/08/fast-bulk-inserts-into-sqlite/
Finding Duplicates with SQL
SELECT email, COUNT(email) AS NumOccurrences FROM users GROUP BY email HAVING ( COUNT(email) > 1 )
Finding rows that occur exactly once
SELECT email FROM users GROUP BY email HAVING ( COUNT(email) = 1 )
SQL 參數化查詢
MySQL
MySQL 的參數格式是以 "?" 字元加上參數名稱而成。
UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4
PostgreSQL/SQLite
PostgreSQL 和 SQLite 的參數格式是以 「:」 加上參數名而成。當然,也支援類似 Access 的匿名參數。
UPDATE "myTable" SET "c1" = :c1, "c2" = :c2, "c3" = :c3 WHERE "c4" = :c4
參數化查詢是防止SQL Injection的另一種方法,但對我目前的case來說沒必要,
mysql_real_escape_string 就能搞定的東西我認為沒必要再複雜化,
或用Active Record就已經處理好這些問題了,
只是怕以後會用到,先學起來。
reference:
http://zh.wikipedia.org/wiki/%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2
MySQL 的參數格式是以 "?" 字元加上參數名稱而成。
UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4
PostgreSQL/SQLite
PostgreSQL 和 SQLite 的參數格式是以 「:」 加上參數名而成。當然,也支援類似 Access 的匿名參數。
UPDATE "myTable" SET "c1" = :c1, "c2" = :c2, "c3" = :c3 WHERE "c4" = :c4
參數化查詢是防止SQL Injection的另一種方法,但對我目前的case來說沒必要,
mysql_real_escape_string 就能搞定的東西我認為沒必要再複雜化,
或用Active Record就已經處理好這些問題了,
只是怕以後會用到,先學起來。
reference:
http://zh.wikipedia.org/wiki/%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2
標籤:
database,
mysql,
postgresql,
sqlite
sqlite foreign key
今天在試著用AR去delete一筆資料時,發現明明就有設定FK,
去SQLITE manager裡刪的話,沒問題,delete跟update都會一起CASCADE,
而且database的foreign key = on, 但在php刪卻沒有CASCADE,
百思不得其解時,到了sqlite官網一看,原來SQLITE的FK是設心酸的...
要設Trigger才會發揮FK的效用,
SQLITE manager是自動「幫忙」刪的,
Mysql的InnoDB引擎就沒這問題,真是被擺了一道。
去SQLITE manager裡刪的話,沒問題,delete跟update都會一起CASCADE,
而且database的foreign key = on, 但在php刪卻沒有CASCADE,
百思不得其解時,到了sqlite官網一看,原來SQLITE的FK是設心酸的...
要設Trigger才會發揮FK的效用,
SQLITE manager是自動「幫忙」刪的,
Mysql的InnoDB引擎就沒這問題,真是被擺了一道。
sqlite 最佳化 & 數據類型 & PRIMARY KEY & FOREIGN KEY
http://www.sqlite.com.cn/MySqlite/4/289.Html
PRAGMA auto_vacuum; 自動清理刪除資料 (效率低,關掉)
PRAGMA cache_size; 記憶體快取 (越高效率越好)
PRAGMA page_size; 系統分頁值
PRAGMA case_sensitive_like; 比對字串時,大小寫區分
PRAGMA count_changes; 就是affected_rows的意思
PRAGMA synchronous; 資料同步 (如:斷電時,資料如何處理,off最快)
PRAGMA temp_store = MEMORY; (將索引放在記憶體)
SQLITE:
http://www.sqlite.org/lang_transaction.html
大量寫入時,先START TRANSACTION,
中間有寫入失敗就ROLLBACK TRANSACTION (包含前面執行成功的都會清除)
最後再COMMIT 或 END TRANSACTION (可避免造成磁區破碎分散區塊)
========
數據類型
http://blog.csdn.net/sunboy_2050/article/details/6665024
========
http://blog.csdn.net/sunboy_2050/article/details/6665024
大小寫比對:
方案一:使用大小寫轉換函數LOWER、UPPER
SELECT * FROM [User] WHERE LOWER(UserName) = 'user1'
方案二:在進行比較時強制聲明不區分大小寫
SELECT * FROM [User] WHERE UserName = 'user1' COLLATE NOCASE
方案三:創建表時聲明該字段不區分大小寫
CREATE TABLE [User] ( [UserName] NVARCHAR(20) COLLATE NOCASE );
====
http://www.phpker.com/mysql-and-the-initial-value-sqlite-reset-auto_increment/610.html
SQLITE AUTO_INCREMENT 復位:
DELETE FROM sqlite_sequence WHERE name = 'your_table_name'
========
sqlite可以設成二種primary key (一定要是INTEGER型態,不可用INT)
1. [id] INTEGER NOT NULL PRIMARY KEY, # 會自動依資料表中最大的再+1
2.[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, #會自動依sequence加,而不管最大值為何
FOREIGN KEY:
http://www.sqlite.org/foreignkeys.html
PRAGMA auto_vacuum; 自動清理刪除資料 (效率低,關掉)
PRAGMA cache_size; 記憶體快取 (越高效率越好)
PRAGMA page_size; 系統分頁值
PRAGMA case_sensitive_like; 比對字串時,大小寫區分
PRAGMA count_changes; 就是affected_rows的意思
PRAGMA synchronous; 資料同步 (如:斷電時,資料如何處理,off最快)
PRAGMA temp_store = MEMORY; (將索引放在記憶體)
SQLITE:
http://www.sqlite.org/lang_transaction.html
大量寫入時,先START TRANSACTION,
中間有寫入失敗就ROLLBACK TRANSACTION (包含前面執行成功的都會清除)
最後再COMMIT 或 END TRANSACTION (可避免造成磁區破碎分散區塊)
========
數據類型
http://blog.csdn.net/sunboy_2050/article/details/6665024
========
http://blog.csdn.net/sunboy_2050/article/details/6665024
大小寫比對:
方案一:使用大小寫轉換函數LOWER、UPPER
SELECT * FROM [User] WHERE LOWER(UserName) = 'user1'
方案二:在進行比較時強制聲明不區分大小寫
SELECT * FROM [User] WHERE UserName = 'user1' COLLATE NOCASE
方案三:創建表時聲明該字段不區分大小寫
CREATE TABLE [User] ( [UserName] NVARCHAR(20) COLLATE NOCASE );
====
http://www.phpker.com/mysql-and-the-initial-value-sqlite-reset-auto_increment/610.html
SQLITE AUTO_INCREMENT 復位:
DELETE FROM sqlite_sequence WHERE name = 'your_table_name'
========
sqlite可以設成二種primary key (一定要是INTEGER型態,不可用INT)
1. [id] INTEGER NOT NULL PRIMARY KEY, # 會自動依資料表中最大的再+1
2.[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, #會自動依sequence加,而不管最大值為何
FOREIGN KEY:
http://www.sqlite.org/foreignkeys.html
訂閱:
文章 (Atom)