2016-12-07 67 views
2

我有一個mysql .sql文件,並試圖使用sqlite內存數據庫進行測試,並使用相同的文件。使用AUTO_INCREMENT創建與SQLite和mysql兼容的SQL

CREATE TABLE IF NOT EXISTS users ( user_id INTEGER PRIMARY KEY AUTO_INCREMENT,

導入時我得到一個錯誤

  • SQLITE_ERROR: near "AUTO_INCREMENT": syntax error

這是documented here

In SQLite a column declared INTEGER PRIMARY KEY will autoincrement by itself. Remove the AUTOINCREMENT keyword and then try.

,因爲它需要對MySQL我無法取出AUTOINCREMENT。有什麼建議?

+2

試圖爲多個數據庫手工創建SQL令人生厭,並且使用最小公分母結束。由於這個原因以及其他原因,最好使用SQL生成器庫,好的一個會爲你處理SQL方言。例如,Javascript有[Knex.js](http://knexjs.org/)。 – Schwern

+0

@Schwern我們已經在使用Knew。我們擁有的一個SQL是在第一次啓動應用程序時創建模式的文件。也許我們也應該向Knex反映。 – ripper234

+0

http://stackoverflow.com/questions/41027538/how-should-i-initialize-my-project-via-node-npm – ripper234

回答

2

我有一個解決方案給你。

MySQL支持一種特殊的註釋語法,因爲當您想要使用適用於更新版本的MySQL而不是早期版本的語法時。也許你見過這樣的事情在mysqldump的輸出:

CREATE TABLE `products` (
    `product_id` int NOT NULL, 
    PRIMARY KEY (`product_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 

請注意,在註釋的字符集的語句,有一個有趣的字符串!40101這意味着「如果MySQL的版本是小於4.1.1,然後忽略此字符串作爲註釋,否則將其作爲SQL語句的一部分執行。「

儘管在SQLite中,評論的內部始終只是一條評論。

所以,你可以定義你的表是這樣的:

CREATE TABLE IF NOT EXISTS users ( 
    user_id INTEGER PRIMARY KEY /*!40101 AUTO_INCREMENT */, 
    . . . 

的SQLite將忽略AUTO_INCREMENT,但MySQL將使用它,假設你使用版本4.1.1或更高版本(這幾乎是一定的)。

我剛剛用SQLite 3.8.5和MySQL 8.0.0-dmr測試了這個,並且create table在這兩種情況下都能正常工作。

INTEGER是好的,因爲它是MySQL中的INT的同義詞。不要在SQLite中使用INT,因爲主鍵列不會自動遞增,除非您真的使用類型INTEGER

不用擔心MySQL中的INT這個參數,如INT(11),那個數字並不意味着什麼重要。

+0

這解決了這個問題......併發送給我在我們的文件中的下一個問題,'ENUM'。我認爲更好的長期解決方案確實是從靜態SQL文件遷移到Knex遷移。 – ripper234

+1

@ ripper234請參閱http://stackoverflow.com/questions/362044/mysql-enum-type-vs-join-tables/362058#362058瞭解我對ENUM的看法。 –

+0

我同意...目前我只是試圖將sql語句遷移到knex而不改變周圍的整個世界:)一次重構一次。 – ripper234