使用另一张表中的值插入新行到一个表中mysql

3

我对MySQL中的触发器还很陌生,所以对于任何看起来“非常简单”的问题都感到抱歉。

我有两个表:orders和orders_log

orders:

order_id (...) product_id (...)
201 (...) 103 (...)

oders_log:

日志ID 操作 表名 操作时间 产品ID
NULL NULL NULL NULL NULL

我想创建一个触发器,当我们向“orders”表中插入新行时,它将在orders_log中生成一行新记录,其中log_id = 1...2..3...等等;并且product_id = "orders"表中的product_id。这样,orders_log将如下所示:

日志ID 操作 表名 操作时间 产品ID
1 插入 orders "now()" 103
我正在尝试编写这段代码:
DROP TRIGGER IF EXISTS addrowlog;
DELIMITER $$
CREATE TRIGGER addrowlog
AFTER INSERT ON orders
FOR EACH ROW
BEGIN 
    insert into orders_log (`log_id`, `action`, `table_name`, `action_time`, `product_id`)
    VALUES  (NEW.log_id, 'insert', 'orders', NOW(), NEW.product_id);
END$$
DELIMITER;

但是它给出了这个错误:错误代码:1054。在“NEW”中未知列'log_id'。

即使我只执行这段代码:

DROP TRIGGER IF EXISTS addrowlog;
DELIMITER $$
CREATE TRIGGER addrowlog
AFTER INSERT ON orders
FOR EACH ROW
BEGIN 
    insert into orders_log (`log_id`, `action`, `table_name`, `action_time`, `product_id`)
    VALUES  (log_id, 'insert', 'orders', NOW(), product_id);
END$$
DELIMITER;

当我尝试向'orders'添加一行时,它会给我错误信息“无法添加或更新子行:外键约束失败”。
有人可以帮帮我吗?
*编辑: 日志表的创建:
CREATE TABLE `orders_log` (
    `log_id` INTEGER NOT NULL,
    `action` VARCHAR(255) DEFAULT NULL,
    `table_name` VARCHAR(255) DEFAULT NULL,
    `action_time` TIME DEFAULT NULL,
    `product_id` INTEGER NOT NULL,
    PRIMARY KEY (`log_id`)
    );

(在中间创建的触发器)

加上

ALTER TABLE `orders_log`
ADD CONSTRAINT `fk_orders_log_3`
  FOREIGN KEY (`product_id`)
  REFERENCES `product` (`product_id`)
  ON DELETE RESTRICT
  ON UPDATE CASCADE;
```*

1
请向我们展示日志表的创建表格。 - nbk
我已经编辑了问题,以展示日志表的创建。 :) - UserNameM
你的问题很明确,你需要为log_id定义一个整数,因为它不是自增或UUID或任何其他可以生成或自动生成的类型。 - nbk
我现在已经完成了“log_id INTEGER NOT NULL AUTO-INCREMENT”,但它仍然给我错误。应该使用“NEW.”还是不使用? - UserNameM
1个回答

2

添加了auto_increment之后,您可以从插入中删除log_id或将其设置为NULL。

CREATE TABLe orders (product_id int)

CREATE TABLE `orders_log` (
    `log_id` INTEGER NOT NULL AUTO_INCREMENT,
    `action` VARCHAR(255) DEFAULT NULL,
    `table_name` VARCHAR(255) DEFAULT NULL,
    `action_time` TIME DEFAULT NULL,
    `product_id` INTEGER NOT NULL,
    PRIMARY KEY (`log_id`)
    );

CREATE TRIGGER addrowlog
AFTER INSERT ON orders
FOR EACH ROW
BEGIN 
    insert into orders_log ( `action`, `table_name`, `action_time`, `product_id`)
    VALUES  ( 'insert', 'orders', NOW(), new.product_id);
END

INSERt INTO orders VALUEs(1)

SELECT * FROM orders_log
日志ID 操作 表名 操作时间 产品ID
1 插入 订单 12:10:43 1

演示链接


非常感谢您! 这真是一个简单的修正! - UserNameM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接