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_typestop_user然后更新行以用 填充列并stop用填充$timestamp列。stop_user$user

我知道这很复杂..或者,至少对我来说是^^非常感谢您的帮助!

4

5 回答 5

2

这通常被称为 MERGE或 upsert。PostgreSQL 没有明确支持这个操作。

MERGE在 PostgreSQL 中看到的关于 PostgreSQL的最佳文章是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 CLAUSE:

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 回答