我想知道是否可以将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查询可以帮我吗?或者也许我错了。
答案 0 :(得分:1)
您可以使用mysql_insert_id()来获取插入记录的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模式。