2

いくつかのpostgreSQLクエリに取り組んでいます。前の質問で言ったように、SQLロジックに関する私の知識はかなり限られています。

行を挿入するこのクエリがあります。

$timestamp = date('Y-m-d G:i:s.u');
$check_time = "start"; //can also be stop
$check_type = "start_user"; //can also be stop_user

$insert_query = "INSERT INTO production_order_process_log (
production_order_id, 
production_order_process_id, 
$check_time, 
$check_type) 
    VALUES (
'$production_order_id', 
'$production_order_process_id', 
'$timestamp', 
'$user')
";

残念ながら、それは毎回新しい行を追加しています。条件付きSQLを追加したいので

Production_order_process_idが存在しない場合は、上記のクエリに記述されているとおりにINSERTを実行します。つまり、すべての新しい情報を含む新しい行を追加します

ただし、production_order_process_idが存在し、check_typeがである場合はstop_user、行をUPDATEして、列を。で埋め、列stopを。で埋めます。$timestampstop_user$user

これは複雑だと思います。または、少なくとも私にとっては^^助けてくれてありがとう!

4

5 に答える 5

2

これは通常 MERGE、アップサートと呼ばれます。PostgreSQLはこの操作を明示的にサポートしていません。

MERGEPostgreSQLのトピックについて私が見た中で最高の記事は、depeszによるこれです。

于 2012-07-19T13:55:09.450 に答える
1

ストアド プロシージャを作成し、新しいレコードを挿入しながら呼び出すことができるとよいでしょう。

    DELIMITER $$

    DROP PROCEDURE IF EXISTS `DB`.`InsertNewRow` $$
    CREATE PROCEDURE `db`.`InsertNewRow` ()
    BEGIN

    DECLARE V_EXIST INT DEFAULT 0;
    DECLARE   V_check_type VARCHAR(20);


    SELECT production_order_process_id,check_type INTO V_EXIST,V_check_type FROM production_order_process_log;

    IF V_EXIST=0 THEN

      INSERT INTO production_order_process_log (
      production_order_id,
      production_order_process_id,
      $check_time,
      $check_type)
        VALUES (
      '$production_order_id',
      '$production_order_process_id',
      '$timestamp',
      '$user');

    ELSEIF V_check_type='stop_user' THEN


      /* UPDATE QUERY HERE */

    END IF;
    END $$

    DELIMITER ;         
于 2012-07-19T11:03:34.427 に答える
1

挿入後 ON DUPLICATE KEY UPDATE...

于 2012-07-19T11:03:50.263 に答える
1

使用MERGEステートメント

使い方はこちら

MERGE INTO table [[AS] alias]
USING [table-ref | query]
ON join-condition
[WHEN MATCHED [AND condition] THEN MergeUpdate | DELETE]
[WHEN NOT MATCHED [AND condition] THEN MergeInsert]

MergeUpdate is
UPDATE SET { column = { expression | DEFAULT } |
          ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) }
[, ...]
(yes, there is no WHERE clause here)

MergeInsert is
INSERT [ ( column [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] )
[, ...]}
(no subquery allowed)

検索すれば、もっと多くの記事や例が見つかるはずです。

于 2012-07-19T11:03:55.333 に答える
0

WHERE 句を挿入するだけです。

INSERT INTO production_order_process_log   
           (  production_order_id, production_order_process_id, check_time, check_type)
    VALUES ( '$production_order_id', '$production_order_process_id', '$timestamp', '$user')
WHERE NOT EXISTS ( SELECT *
        FROM production_order_process_log nx
        --
        --  assuming production_order_id is the Primary Key, here
        --
        WHERE nx.production_order_id = '$production_order_id'
        );

更新: パラメータと VALUE() に混乱しました。以下のフラグメントはパラメーターなしで機能しますが、即時値を使用します。

INSERT INTO tmp.production_order_process_log
           (  production_order_id, production_order_process_id, check_time, check_type)
    SELECT 1, 2, '2012-07-19 12:12:12', 'Lutser'
WHERE NOT EXISTS ( SELECT *
        FROM tmp.production_order_process_log nx
        --
        --  assuming production_order_id is the Primary Key, here
        --
        WHERE nx.production_order_id = 1
        );

(パラメータを再度追加するには、少し変更する必要があります)

于 2012-07-19T11:06:42.170 に答える