2017-03-19 45 views
0

我對SQL很陌生,發現了類似的問題,但我提出了建議的更改,但仍然收到相同的錯誤。任何人都可以在正確的方向提示我爲什麼我仍然可能會收到此錯誤?初學者mysql - 語法錯誤創建表

任何建議或幫助將不勝感激。謝謝。

mysql> USE famous_scientists; 
Database changed 
    -> CREATE TABLE scientists (
    ->  id INT(1) NOT NULL auto_increment, 
    ->  name VARCHAR(255) NOT NULL, 
    ->  discovery VARCHAR(255) NOT NULL, 
    ->  year_of_birth INT(4) NOT NULL, 
    ->  year_of_death INT(4) NULL, 
    ->  PRIMARY KEY (id) 
    ->) AUTO_INCREMENT=1; 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near ' 
CREATE TABLE scientists (
    id INT(1) NOT NULL auto_increment, 
    name V' at line 1 
+0

什麼是INT(1)? –

+0

說明: id:最大整數。大小爲1.不能爲空。自動從1增量。因此,我認爲它必須設置爲(1) –

+1

INT(1)和INT(4)控制zerofull而不是該數字的存儲字節或不限制值的範圍... read https:// dev。 mysql.com/doc/refman/5.5/en/numeric-type-attributes.html –

回答

0

嘗試:

mysql> USE famous_scientists; 
Database changed 
    CREATE TABLE scientists (
     id INT NOT NULL auto_increment, 
     name VARCHAR(255) NOT NULL, 
     discovery VARCHAR(255) NOT NULL, 
     year_of_birth INT(4) NOT NULL, 
     year_of_death INT(4) NULL, 
     PRIMARY KEY (id) 
    ) AUTO_INCREMENT=1; 
+0

好了,我猜想當我這樣做時,我保留了一個'('there'或者其他東西。非常感謝你! –

0
CREATE TABLE scientists (
     id INT NOT NULL auto_increment, 
     name VARCHAR(255) NOT NULL, 
     discovery VARCHAR(255) NOT NULL, 
     year_of_birth INT(4) NOT NULL, 
     year_of_death INT(4) NULL, 
     PRIMARY KEY (id) 
    ) 
+0

這個SQL的答案是錯誤的,'year_of_death INT(4)NULL'是強制性的,因爲'PRIMARY KEY (id)'線 –

1

你的代碼工作正常。請參閱SQL Fiddle

如果您有錯誤,它可能會高於此代碼。錯誤消息是說create未被識別。有時候壞字符可能會蠕變。

0
mysql> USE famous_scientists; 
Database changed 
    -> 

這個^^^^箭是錯的。它不應該在這裏。

你應該看到這一點:

mysql> USE famous_scientists; 
Database changed 
mysql> 

,你沒有表明,一些奇怪的事情是怎麼回事,並附上您打字或粘貼數據的事實這是不是一個真正的語法錯誤,這是隻是公然的混亂。

->箭頭意味着CLI認爲您已經處於鍵入或粘貼SQL語句的中間,顯然您並不打算這麼做。

接下來要做的事情就是Control-C並重新開始。

錯誤信息本身是非常普遍的 - 任何類型的語法錯誤都會觸發它,但是如果你內在化了它的意思,你會爲自己節省很多精神上的痛苦。這似乎很神祕,但實際上並非如此。

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '...'

無論是詞near後的單引號內是發生錯誤時尚未被解析查詢的一部分。

換句話說,你看到的是開始的確切位置的的- 左到右 - 在查詢停止了語法意義的服務器。

重要的是,報告的具體錯誤不會晚於引用字符串的開始。之前也不太可能,因爲在查詢之前的任何位置,服務器認爲它在語法上是有效的。您可能在查詢的早期出現錯誤,但它不符合您的要求,但從服務器的角度來看,它不是語法錯誤。

例子:

mysql> SELECT * * FROM t1; 
ERROR 1064 (42000): ...right syntax to use near '* FROM t1' at line 1 

第二*就是混淆了。之後的內容並不重要,因爲第二個*在語法上無效。

mysql> SELECT * FROM FROM t1; 
ERROR 1064 (42000): ...right syntax to use near 'FROM t1' at line 1 

同樣的東西......第二個FROM無效。解析停在那裏,因爲它沒有意義。

比方說,我想刪除一個表,但我忘記鍵入單詞DROP

mysql> TABLE t1; 
ERROR 1064 (42000): ...right syntax to use near 'TABLE t1' at line 1 

服務器說「等一下,你不能用關鍵字TABLE開始查詢。」查詢中的第一件事是錯誤的。

請注意,我實際上沒有一個名爲t1的表,但服務器沒有檢查這一點。遇到的第一個意想不到的事情就是停止這個過程。

這個例子就像你的...服務器似乎在抱怨查詢的開始......因此,查看任何更深入的查詢是完全沒有必要的。

所以這個錯誤...

...the right syntax to use near ' 
CREATE TABLE scientists (

...馬上告訴你這個服務器是由CREATE或者一些控制字符或東西,看起來像空格前混淆。但問題不在後面。 CREATE尚未評估。

這怎麼可能?你是對的,不是......除非在此之前有一些東西被輸入......我們知道這是由於->提示。它究竟是什麼或者究竟如何到達那裏是不可能推測的。

最後一個例子,這一個往往是最容易混淆的......但是一旦你理解了上面的所有內容,它就很有意義。

mysql> SELECT * FROM user WHERE; 
ERROR 1064 (42000): ...right syntax to use near '' at line 1 

等等,什麼? near ''是什麼意思?

請記住部分引號中的第一件事情,從服務器混淆開始?在這種情況下困擾服務器的是它解析了所有內容,一直到我的查詢結果,並發現我的查詢沒有任何意義。它很困惑,因爲在解釋我的查詢時,它需要更多,但它沒有發現更多。但是,我的查詢不可能完成,因爲我沒有在WHERE之後放置任何東西。所以near ''意味着結束後所有的東西。解析器(或者也許是詞法分析器,我離題了)已經耗盡了所有需要檢查的事情,但查詢仍然不完整,所以錯誤「接近」......沒有。它接近於在查詢結束時未解析的任何內容。

如果您的查詢有任何問題,這個錯誤並沒有告訴您這個問題。它基本上不被解析。

但是現在你知道如何在面對ERROR 1064 (42000)時「像MySQL一樣思考」,並試圖弄清楚服務器試圖告訴你什麼。