2011-09-30 12 views
11

पर विचार करें:मैं एक चर के आधार पर एक स्कीमा का चयन कैसे करूं?

SET @PREFIX='DEV_'; 

SET @REFRESHDB=CONCAT(@PREFIX,'Refresh'); 

CREATE TABLE @REFRESHDB.`Metadata` 
(
    `Key` VARCHAR(30) NOT NULL, 
    `Value` VARCHAR(30) NOT NULL, 
    PRIMARY KEY (`Key`) 
) ENGINE = InnoDB; 

INSERT INTO @REFRESDB.`Metadata` (`Key`, `Value`) VALUES ("Version", "0"); 

यह मान्य होना प्रतीत नहीं होता है: mysql के साथ वापस आता है:

आप अपने एसक्यूएल वाक्य रचना में एक त्रुटि है, मैनुअल है कि आपके MySQL सर्वर संस्करण से मेल खाती है सही वाक्य रचना 'के पास का उपयोग करने के लिए @ REFRESHDB.`Metadata`

जहां तक ​​मेरा बता सकते हैं मैं सही ढंग से the documentation के अनुसार कार्य कर लेते हैं की जाँच करें। फिर भी MySQL का कहना है कि इसकी अनुमति नहीं है। क्या यह MySQL की कुछ सीमा है (चर के रूप में चर के उपयोग की अनुमति नहीं है) या कुछ और?

उत्तर

3

प्रलेखन राज्यों:

"उपयोगकर्ता चर से एक मूल्य सौंपा जा सकता है डेटा प्रकारों का एक सीमित सेट: पूर्णांक, दशमलव, फ़्लोटिंग-पॉइंट, बाइनरी या नॉनबाइनरी स्ट्रिंग, या नल मान "

आप एक ऑब्जेक्ट के रूप में चर का उपयोग करने की कोशिश कर रहे हैं। यह समर्थित नहीं है।

+0

मुझे नहीं लगता कि परिवर्तनीय नियंत्रणों को क्या आवंटित किया जा सकता है जहां चर का उपयोग किया जा सकता है। –

+0

आप इसे किसी ऑब्जेक्ट के रूप में उपयोग कर रहे हैं, जिसका अर्थ यह है कि '@ REFRESHDB' का मान एक स्कीमा ऑब्जेक्ट है, न कि स्ट्रिंग मान वास्तव में है। –

+1

डाउनवॉटर टिप्पणी करने की देखभाल करते हैं? –

8

आपको ऐसा करने के लिए तैयार कथन/गतिशील एसक्यूएल का उपयोग करना होगा।

यह लेख उत्कृष्ट विस्तार से इन दोनों के ऊपर जाता है:

http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html

इस प्रयास करें:

SET @PREFIX='DEV_'; 

SET @REFRESHDB=CONCAT(@PREFIX,'Refresh'); 

SET @st = CONCAT('CREATE TABLE ', @REFRESHDB,'.`Metadata` 
(
    `Key` VARCHAR(30) NOT NULL, 
    `Value` VARCHAR(30) NOT NULL, 
    PRIMARY KEY (`Key`) 
) ENGINE = InnoDB'); 

PREPARE tStmt FROM @s; 
EXECUTE tStmt; 


SET @s = CONCAT('INSERT INTO ', @PREFIX, '.`Metadata` (`Key`, `Value`) VALUES ("Version", "0")'); 

PREPARE stmt FROM @s; 
EXECUTE stmt; 
+0

CREATE TABLE बयान विफल रहता है। –

+0

ओह मुझे याद आया, आपको इसे एक तैयार कथन में भी रखना होगा। मैंने इसे तैयार तालिका को तैयार कथन में रखने के लिए इसे अद्यतन किया है। –

+0

उस सुधार के साथ, आपने जो काम किया है, लेकिन जो भी इसे लागू करना चाहता है, उसके लिए सुरक्षा और प्रदर्शन विचारों से अवगत रहें। गतिशील एसक्यूएल एक काला कला का थोड़ा सा हो सकता है। –

0

मेरा सुझाव है कि आप एक संग्रहीत प्रक्रिया लिखें:

DELIMITER $$ 
CREATE PROCEDURE (IN DBname varchar(255) 
       , IN AKey varchar(255) 
       , IN AValue varchar(255)) 
BEGIN 
    DECLARE query VARCHAR(1000); 
    -- First check the DBName against a list of allowed DBnames, 
    -- to prevent SQL-injection with dynamic tablenames. 

    DECLARE NameAllowed BOOLEAN; 
    SELECT 1 INTO NameAllowed WHERE DBName IN ('validDB1','validDB2'); 
    IF (NameAllowed = 1) THEN BEGIN 

    -- DBName is in the whitelist, it's safe to continue. 
    SET query = CONCAT('INSERT INTO ' 
         ,DBName 
         ,'.MetaData (`key`,`value`) values (?,?)); 
    -- note the use of parameter placeholders, to prevent SQL-injection. 
    PREPARE stmt FROM query; 
    EXECUTE stmt USING Akey, AValue; 
    DEALLOCATE PREPARE stmt; -- clears the query and its result from the cache. 
    END; END IF; 
END $$ 

DELIMITER ; 
+0

यह क्रिएट टेबल कथन पर असफल रहा है, न कि सम्मिलित करें। –

संबंधित मुद्दे

 संबंधित मुद्दे