2017-08-31 47 views
-1

我使用SQLite的這一個這兩個sql腳本有什麼區別?

CREATE TABLE IF NOT EXISTS developer(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,skill TEXT,yearsOfExperience INTEGER); 
INSERT INTO developer(name, skill, yearsOfExperience) VALUES ('Simon', 'Ionic', '4'); 
INSERT INTO developer(name, skill, yearsOfExperience) VALUES ('Jorge', 'Firebase', '2'); 
INSERT INTO developer(name, skill, yearsOfExperience) VALUES ('Max', 'Startup', '5'); 

雖然這是一個從導出MySQL數據庫

CREATE TABLE IF NOT EXISTS `user` (
    `user_id` int(11) NOT NULL, 
    `username` varchar(50) DEFAULT NULL, 
    `password` varchar(300) DEFAULT NULL, 
    `first_name` varchar(200) DEFAULT NULL, 
    `last_name` varchar(200) NOT NULL, 
    `email` varchar(300) DEFAULT NULL, 
    `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

他們都是SQL但爲什麼第二個是不是SQLite中,當我接受導入它? 我希望有人可以告訴我有什麼區別,所以我可以使第二個sql的副本變成sqlite可讀的

+1

你能分享確切的錯誤訊息嗎?沒關係,SQLite沒有名爲'InnoDB'的這種引擎......這是100%的MySQL事情,我猜想在第二個表中有一些其他MySQL特定的語法。 –

+0

@TimBiegeleisen我有同樣的猜測。我希望有人可以告訴它是什麼,所以我可以將第二個sql的副本放入sqlite可讀的 –

+0

爲了將來的參考,請嘗試更清楚地描述您的問題。如果您問過如何將此表從MySQL遷移到SQLite,您可能沒有得到低估。 –

回答

0

您可以重構當前的MySQL CREATE TABLE聲明第二臺本:

CREATE TABLE IF NOT EXISTS user (
    user_id INTEGER NOT NULL, 
    username TEXT, 
    password BLOB, 
    first_name TEXT, 
    last_name TEXT, 
    email TEXT, 
    created INTEGER 
) 

的SQLite的語法不支持SPECI搭載引擎(例如InnoDB的)。此外,沒有varchar列類型,但有TEXTINTEGER。默認情況下,列的值將爲NULL,因此如果NULL是您需要的默認值,則不需要明確指定它。 SQLite遵循SQL標準來轉義列和表名,並且使用雙引號而不是反引號。所以我刪除了所有列名中的反引號。

最後,我選擇讓你的created時間戳爲INTEGER。您可以存儲自紀元以來的秒數,即UNIX時間戳。另一種方法是將時間戳存儲爲TEXT,但根據您打算執行的操作,這可能更難。

+0

哦,所以它只接受2? (TEXT和INTEGER)。所以密碼不能被加密/散列權? –

+0

@JaneDoe檢查[這裏](https://sqlite.org/datatype3.html)獲取SQLite數據類型的列表。您可以加密用戶的純文本密碼,然後將其存儲爲「BLOB」類型。 –

+0

好的@Tim感謝您的幫助。我今天學到了一些新東西 –

0

mysql不是sqllite,您必須更新您的第二個sql查詢,以便被sqllite接受(因爲類型時間戳中不存在sqllite):

CREATE TABLE IF NOT EXISTS `user` (
`user_id` INTEGER PRIMARY KEY AUTOINCREMENT, 
`username` varchar(50), 
`password` varchar(300) , 
`first_name` varchar(200), 
`last_name` varchar(200) NOT NULL, 
`email` varchar(300), 
`created` TEXT NOT NULL 
); 
+0

這不是有效的SQLite語法。 –

+0

@abderrahime你能告訴我更多關於它嗎?有什麼我可以用作時間戳嗎? –

+0

TIMESTAMP就像一個intger(1970年後的秒數),所以你可以用文本或類型NUMBER替換它,但我認爲你也可以使用TIMESTAMP:試試這個:CREATE TABLE IF NOT EXISTS user( user_id INTEGER PRIMARY KEY AUTOINCREMENT, 名文本, 密碼文本, FIRST_NAME TEXT, 姓氏TEXT NOT NULL, 電子郵件文本, 創建TIMESTAMP NOT NULL ); –