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;