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;