2017-01-08 19 views
0

MySQL/MariaDBを使用してUPSERTステートメントを作成しようとしています。プロシージャはPHPファイルから呼び出されています。このファイルはINSERTで正常に動作します。しかし、UPDATEの場合、INSERTは常に実行されます。手順MySQLの手動インストールの更新がLAMPで機能しない

PHPはそうc075860fd58b11e6b0a03d5c165b858c(32の文字と既存のレコード)のように、ターゲットのIDを受信して​​います。

面白いことは、私は4台の異なるサーバー上で手順を実行しようとしたということです。

  • 私の個人的な開発サーバーは のApache、PHPとMySQLでインストールのWindows Server 2016を手動でインストールされています。
  • 私のパーソナルラップトップにはWindows 10 ProにWAMPがインストールされています。
  • 私の学術機関で使用されているワークステーションには、Windows 7 ProにXAMPがインストールされています。
  • 生産環境には、Apache、PHP、およびMySQLがUbuntu Server 16.04.1にインストールされています。

次の手順は個人用サーバーでは機能しますが、残りのデバイスでは実行できません。いずれもMySQL 5.7がインストールされています。ユーザー権限の問題を排除するために、私は4つのデバイス(Personal Server、Personal Laptop、Production Environment)のうち3つでrootユーザーを使用して以下の手順を実行しました。

私は何かが欠落している可能性がありますか?

また、新しいレコードが挿入されず、更新されないphpmyadminから直接プロシージャを実行しようとしました。この手順は、IDE(DataGrip)から実行すると個人用サーバーでうまく動作します。この問題が発生する場合があります誰のため

CREATE PROCEDURE usp_upsertProperty 
        (
         IN var_location   VARCHAR(50) 
         , IN var_price   DECIMAL(20, 2) 
         , IN var_type   VARCHAR(50) 
         , IN var_description TEXT 
         , IN var_id    VARCHAR(32) 
        ) 
BEGIN 

    DECLARE   var_locationID SMALLINT; 
    DECLARE   var_typeID TINYINT; 

    IF (LENGTH(var_id) != 32) THEN 

     SET var_id = 
     (
      SELECT REPLACE(UUID(), '-', '') 
     ); 

    END IF; 

    SET var_locationID = 
    (
     SELECT  L.location_id 
     FROM  tbl_locations AS L 
     WHERE  L.name = var_location 
    ); 

    SET var_typeID = 
    (
     SELECT  T.type_id 
     FROM  tbl_propertyTypes AS T 
     WHERE  T.name = var_type 
    ); 

    INSERT INTO  tbl_properties 
        (
         property_id 
         , location_id 
         , price 
         , type_id 
         , description 
         , listing_date 
        ) 
    VALUES   (
         var_id 
         , var_locationID 
         , var_price 
         , var_typeID 
         , var_description 
         , CURRENT_TIMESTAMP() 
        ) 
    ON DUPLICATE KEY UPDATE 
        location_id = var_locationID 
        , price = var_price 
        , type_id = var_typeID 
        , description = var_description; 

END; 

答えて

0

、私は溝にINSERT INTO ... ON DUPLICATE KEY UPDATEを決定し、IF文の中UPDATEを置きます。

文は次のようになります。

BEGIN 

    DECLARE   var_locationID SMALLINT; 
    DECLARE   var_typeID TINYINT; 

    SET var_locationID = 
    (
     SELECT  L.location_id 
     FROM  tbl_locations AS L 
     WHERE  L.name = var_location 
    ); 

    SET var_typeID = 
    (
     SELECT  T.type_id 
     FROM  tbl_propertyTypes AS T 
     WHERE  T.name = var_type 
    ); 

    IF (LENGTH(var_id) != 32) THEN 

     SET var_id = 
     (
      SELECT REPLACE(UUID(), '-', '') 
     ); 

     INSERT INTO  tbl_properties 
         (
          property_id 
          , location_id 
          , price 
          , type_id 
          , description 
          , listing_date 
         ) 
     VALUES   (
          var_id 
          , var_locationID 
          , var_price 
          , var_typeID 
          , var_description 
          , CURRENT_TIMESTAMP 
         ); 

    ELSE 

     UPDATE   tbl_properties 
     SET    location_id = var_locationID 
         , price = var_price 
         , type_id = var_typeID 
         , description = var_description 
     WHERE   property_id = var_id; 

    END IF; 

END