2011-08-02 39 views
0

在一個新的MySQL會議的下列作品CREATE TABLE:語法錯誤嘗試在使用會話變量

CREATE DATABASE rand27818; 
USE rand27818; 
CREATE TABLE sessions (id INT NOT NULL AUTO_INCREMENT, session VARCHAR(128), PRIMARY KEY(id)); 
DROP DATABASE rand27818; 

然而,並非this--

SET @sesslen = 128; 
CREATE DATABASE rand27818; 
USE rand27818; 
CREATE TABLE sessions (id INT NOT NULL AUTO_INCREMENT, session VARCHAR(@sesslen), PRIMARY KEY(id)); 
DROP DATABASE rand27818; 

--does;返回:

「ERROR 1064(42000):你在你的SQL語法錯誤;檢查對應於您的MySQL服務器版本的權利 語法使用近「@sesslen的 手冊),PRIMARY KEY(ID))」在

我試圖與周圍的變量額外的括號若干組合,去掉@符號,期運用數據庫等方面沒有喜悅後分配變線1" 。 (不是我認爲它會有所作爲。)在INSERT語句和SELECT變量中使用變量似乎沒有問題,我只是在嘗試創建時遇到問題。

我在想,這是我安裝的好奇心(MySQL與XAMPP捆綁在一起,以防萬一)或者由於我對MySQL的概念誤解而遺漏了某些東西。如果後者,有人可以解釋我錯過了什麼嗎?

回答

0

您應該使用prepared statements

SET @sesslen = 128; 
CREATE DATABASE rand27818; 
USE rand27818; 

SET @sql = CONCAT('CREATE TABLE sessions (id INT NOT NULL AUTO_INCREMENT, session VARCHAR(', @sesslen, '), PRIMARY KEY(id));'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
... 
+0

感謝您的解決方案。它確實有效,但我給出的例子是來自一個更大的安裝轉儲的片段,我正在編寫涉及創建包含多個字段的表的六個此類變量。因此,準備好的陳述是過度的 - 這一切開始變得相當笨拙。真的沒有更方便的方法來做到這一點嗎? – user874055

0

嘗試SET @sesslen := 128;

您定義與MySQL值:=而不是=

+0

這不是問題;無論如何,該變量正在設置。但是,我確實嘗試過:=並且它沒有解決問題。 – user874055