2017-01-08 1 views
0

MySQL/MariaDB를 사용하여 UPSERT 문을 작성하려고합니다. 이 프로 시저는 INSERT에서 잘 작동하는 PHP 파일에서 호출됩니다. 그러나 UPDATE의 경우 INSERT가 항상 수행됩니다.절차 MySQL의 수동 설치에 대한 업데이트가 LAMP에서 작동하지 않습니다.

PHP 정도로 c075860fd58b11e6b0a03d5c165b858c (32 개 문자 및 기존 레코드)과 같은 타겟의 ID를 수신한다.

재미있는 것은

내가 4 개 개의 다른 서버에서 프로 시저를 실행 시도한 것입니다 :
  • 내 개인 개발 서버

    는 아파치, 수동으로 설치 PHP와 MySQL 설치 윈도우 서버 2016이있다.
  • 내 개인 랩탑에는 Windows 10 Pro에 WAMP가 설치되어 있습니다.
  • 내 학업 기관에서 사용중인 워크 스테이션에는 Windows 7 Pro에 XAMP가 설치되어 있습니다.
  • 프로덕션 환경에는 Apache, PHP 및 MySQL이 우분투 서버 16.04.1에 설치되어 있습니다.

다음 절차는 개인용 서버에서 작동하지만 나머지 장치에서는 수행하지 않습니다. 모두 MySQL 5.7이 설치되어 있습니다. 가능한 사용자 권한 문제를 제거하기 위해 필자는 4 개의 장치 (Personal Server, Personal Laptop, Production Environment) 중 3 개에서 루트 사용자를 사용하여 다음 절차를 실행했습니다.

제가 누락 된 부분이있을 수 있습니까?

또한 필자는 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 
관련 문제