MySQL INSERT SELECT并获取主键值

时间:2014-03-11 11:32:27

标签: php mysql

我想知道是否可以将SELECT语句中的记录从源表INSERT到目标表中,获取INSERT ID并在源表的所有相应记录上更新字段。

例如,目的地表'付款':

CREATE TABLE `payments` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `txid` TEXT NULL,
    `amount` DECIMAL(16,8) NOT NULL DEFAULT '0.00000000',
    `worker` INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (`id`)
)

来源表'log':

CREATE TABLE `log` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `solution` VARCHAR(80) NOT NULL,
    `worker` INT(11) NOT NULL,
    `amount` DECIMAL(16,8) NOT NULL DEFAULT '0.00000000',
    `pstatus` VARCHAR(50) NOT NULL DEFAULT 'pending',
    `payment_id` INT(10) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)

“日志”表包含已完成任务的多个“小额付款”。 “付款”表的目的是将小额付款合并为一笔较大的付款:

INSERT INTO payments p (amount, worker)
                SELECT SUM(l.amount) AS total, l.worker FROM log l
                WHERE l.pstatus = "ready"
                AND l.payment_id IS NULL
                AND l.amount > 0
                GROUP BY l.worker

我不确定是否从上面的代码中清楚,但我希望字段“payment_id”被赋予插入ID的值,以便可以追溯微支付到更大的合并支付。

我可以做所有客户端(PHP),但我想知道是否有一些神奇的SQL查询可以帮我吗?或者也许我错了。

3 个答案:

答案 0 :(得分:1)

您可以使用mysql_insert_id()来获取插入记录的ID。

  

请参阅mysql_insert_id()

但上述功能已弃用。

如果您正在使用PDO,请使用PDO::lastInsertId

如果您使用的是Mysqli,请使用mysqli::$insert_id

答案 1 :(得分:1)

嗯,表之间的链接列是worker列。插入值后,只需执行

UPDATE log l
INNER JOIN payments p ON l.worker = p.worker
SET l.payment_id = p.id;

就是这样。或者我的问题是错的?请注意,列名称/ unsigned属性不同。你可能想改变它。

答案 2 :(得分:0)

我认为你应该在php中使用ORM,如下所示:

查看Doctrine

Doctrine 1.2实现了Active Record。 Doctrine 2+是DataMapper ORM。

另外,请查看Xyster。它基于Data Mapper模式。

另外,请查看DataMapper vs. Active Record.