0

我正在爲我們的遷移功能創建一個sql腳本。我們希望將數據從一個magento實例遷移到另一個(使用純SQL,因爲magento的導入/導出非常有限)。MySQL:在存儲過程中準備好語句 - 參數錯誤1064

我想要動態地改變表的AUTO_INCREMENT值,所以不需要在多個步驟中手動完成,這是一個挑戰。我想將AUTO_INCREMENT值設置爲相應的列+ 1

的電流 - 最大值I製備的下面的存儲過程爲這樣:

DELIMITER $$ 

    CREATE PROCEDURE alter_auto_inc_customer() 
    BEGIN 

     SELECT @max := MAX(entity_id)+ 1 FROM customer_entity; 

     PREPARE stmt FROM 'ALTER TABLE customer_entity AUTO_INCREMENT = ?'; 
     EXECUTE stmt USING @max; 

    END $$ 

該命令運行順利。此後的程序應該只是一個簡單的語句來調用:

CALL alter_auto_inc_customer(); 

當我執行「呼叫」語句來,我收到了1064語法錯誤。這也可能是微不足道的,但我無法弄清楚了我的生活......

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 '?' at line 1 

有沒有人有一個想法是什麼問題?

我需要將它存入一個或多個存儲過程,因爲我需要能夠爲數據庫中的多個表運行類似的語句。

回答

0

而是修改表結構,你可以使用觸發器前插入數據,以獲得最大價值+ 1:

DELIMITER $$ 
DROP TRIGGER IF EXISTS custom_autoincrement_bi$$ 

CREATE TRIGGER custom_autoincrement_bi BEFORE INSERT ON customer_entity 
FOR each ROW 
BEGIN 

    SET NEW.entity_id = select max(entity_id) + 1 from customer_entity; 

END$$ 

DELIMITER ; 

但是,如果你想從存儲過程改變表

DELIMITER $$ 

CREATE PROCEDURE alter_auto_inc_customer() 
BEGIN 

    SELECT MAX(entity_id) + 1 into @max FROM customer_entity; 
    set @sql = concat('ALTER TABLE customer_entity AUTO_INCREMENT = ', @max); 
    PREPARE stmt FROM @sql; 
    EXECUTE stmt ; 
    DEALLOCATE PREPARE stmt; 

END $$ 
+0

嗨,這是一個解決方法,但我想使用一個過程。正如我所說我需要用多個表執行此操作,並且希望通過一次調用來處理所有操作(而不是多個觸發器) –

+0

我修改了我的答案,添加了一些存儲過程並進行了一些更改。 –

+0

你的程序就像一個魅力。非常感謝你! –