2016-10-29 67 views
1

我需要做批量 MYSQL插入/更新。我有批處理插入語句的工作,但當插入來作爲多個一個襯裏它不會..同樣,我一直無法生成批量更新。請看下面的例子。MYSQL:單個查詢批量插入/更新語句

插入語句工作

$sql = "INSERT INTO `test` (`somefield`) VALUES ('test', 'test');"; 
db::statement($sql); 

單獨插入語句工作

$sql = "INSERT INTO `test` (`somefield`) VALUES ('test'); INSERT INTO `test` (`somefield`) VALUES ('test');"; 
db::statement($sql); 

SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的SQL語法錯誤;在'1'(SQL:INSERT INTO testsomefield)VALUES('test')'中插入'INSERT INTO testsomefield)VALUES('test')'附近使用的正確語法對應的手冊。 INSERT INTO testsomefield)VALUES( '測試');)

批量更新語句不工作

$sql = "INSERT INTO 'flights' (`id`, `airline`) VALUES ('142832', 'BA') ON DUPLICATE KEY UPDATE `airline`=VALUES(`airline`);" 
db::statement($sql); 

1064 - 你有一個錯誤的SQL語法;檢查位於第1行

對應於你的MySQL服務器版本正確的語法使用近'飛行(idairline)VALUES(‘142832’,‘BA’)對重複鍵上」手冊來自多個職位#1 - 但我得到一些錯誤

多個INSERT語句 - Multiple SQL Update Statements in single query

批量更新語句 - Multiple Updates in MySQL

希望對此有所幫助 - 謝謝!

+2

您一次只能使用該函數執行*一條語句。不要使用多語句命令,它只是麻煩。爲什麼不提供一個值列表,比如'(?,?),(?,?)',準備一個單獨的語句,並多次執行它,或使用CSV文件和'LOAD DATA INFILE'將其導入EN-集體?記住';'只對'mysql'命令行工具有意義,它是默認的分隔符,但是MySQL驅動程序沒有這個概念,你必須打包單個語句。 – tadman

+1

另外,表名和列名使用反引號'\''進行轉義,默認情況下,字符串會獲得單引號或雙引號。你一般只需要逃脫衝突[MySQL的保留關鍵字(http://dev.mysql.com/doc/refman/5.7/en/keywords.html)或有不規則的字符,它們像一個空間列/表名,其他一切都可以保持原樣。 – tadman

回答

2

這很奇怪。快速瀏覽一下,看起來批處理語句是錯誤的,據推測這是正常工作。

語義上正確的批處理語句將使括號分隔每行數據,即。像這樣:

INSERT INTO test 
VALUES 
    ('test1') 
, ('test2') 
, ('test3'); 

單獨的INSERT語句看起來很好,但是,你的數據庫驅動程序可能不支持在其statement方法多條語句(最不這樣做,據我所知)。解決方法是從客戶端啓動事務,循環訪問語句數組並執行。然後執行所有語句時,如果沒有錯誤,則提交或回滾事務。儘管第一種選擇更快。

update語句不起作用,因爲表名flights使用單引號括起來。如果你想引用模式/表/列標識符,可以使用回蜱,並保留單引號字符串值&日期,因爲你已經在同一查詢的其他地方進行。只有在數據庫元素名稱是保留字時才需要轉義數據庫元素名稱,但命名數據庫元素如'into','user'等是不好的做法,應該避免。

INSERT INTO flights (`id`, `airline`) 
VALUES 
('142832', 'BA') 
ON DUPLICATE KEY UPDATE 
airline=VALUES(`airline`) 
+0

謝謝 - 絕對正確!讚賞清楚的答案。將不得不查看交易選項 –

1

嘗試取消引用航班,或在最後一個查詢(批次更新語句)中使用反向嘀嗒舉報。

+0

謝謝 - 絕對正確! –