1

我有一个名为“产品”的表,以下列是可以在该表中找到的示例(尽管还有更多):

  • products_id
  • 价格
  • 我们的成本

当 price/our_cost 更新时,我想在 products_history 表中插入一行,内容如下:

  • products_id 正在更改
  • 正在更改的字段
  • 旧值
  • 新价值
  • 进行更改的员工的员工 ID(在 PHP 中作为变量 $login_id 提供给我)

这是我当前的触发器,虽然我希望它可以工作(除了输入employee_id),但我收到一条错误消息Column count doesn't match value at row 1

DELIMITER |

CREATE TRIGGER after_update_products
    AFTER UPDATE ON products FOR EACH ROW
    BEGIN
        SET @History = '';

        IF NEW.price <> OLD.price THEN
            SET @History = CONCAT(@History, '(', OLD.products_id, ", price, ", OLD.price, ", ", NEW.price, "),");
        END IF;

        IF NEW.our_cost <> OLD.our_cost THEN
            SET @History = CONCAT(@History, '(', OLD.products_id, ", our_cost, ", OLD.our_cost, ", ", NEW.our_cost, "),");
        END IF;

        IF @History <> '' THEN
            SET @History = SUBSTRING(@History, 2, CHAR_LENGTH(@History) - 3);
            INSERT INTO products_history (products_id, field, old_value, new_value) VALUES (@History);
        END IF;
    END;
|

DELIMITER ;

我究竟做错了什么?

最重要的是,我是否需要担心在我插入的东西周围加上引号(当我这样做时,上面的错误仍然存​​在),并且转义会成为一个问题吗?

另外,如何让 PHP 将 $login_id 添加到更新的每一行?

4

3 回答 3

1

尝试从@History 周围删除“(”和“)”。

INSERT INTO products_history (products_id, field, old_value, new_value) VALUES @History;

此外,您将无法让 PHP 脚本将 login_id 传递给触发器,因为它的处理超出了 PHP 的影响。您可能无法使用 TRIGGER,并且可能必须在 PHP 脚本中构建该 INSERT 语句。

于 2013-05-28T18:15:06.363 回答
0

您可以简单地将“employee_id”字段添加到您的产品列表中,然后,触发器应如下所示:

CREATE TRIGGER after_update_products
AFTER UPDATE ON products FOR EACH ROW
BEGIN
    IF NEW.price <> OLD.price THEN
        INSERT INTO products_history (products_id, field, old_value, new_value, guy, date) VALUES (old.products_id,'price',old.price,new.price,new.employe_id,now());
    END IF;

    IF NEW.our_cost <> OLD.our_cost THEN
        INSERT INTO products_history (products_id, field, old_value, new_value, guy, date) VALUES (old.products_id,'our_cost',old.our_cost,new.our_cost,new.employe_id,now());
    END IF;
END;
于 2014-10-10T06:49:30.913 回答
0

你为什么要创建一个额外的变量?你真的不需要它。你为什么不试试这个:

CREATE TRIGGER after_update_products
AFTER UPDATE ON products FOR EACH ROW
BEGIN
    IF NEW.price <> OLD.price THEN
        INSERT INTO products_history (products_id, field, old_value, new_value) VALUES (old.products_id,'price',old.price,new.price);
    END IF;

    IF NEW.our_cost <> OLD.our_cost THEN
        INSERT INTO products_history (products_id, field, old_value, new_value) VALUES (old.products_id,'our_cost',old.our_cost,new.our_cost);
    END IF;
END;

我不太清楚您的最后一个问题“另外,我怎样才能让 PHP 将 $login_id 添加到更新的每一行?”

于 2013-05-28T18:11:17.613 回答