我对MySQL中的触发器还是个新手,所以对于那些看起来"非常简单"的问题,我很抱歉.

我有两个表:Orders和Orders_LOG

订单:

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

或日志(log)(_L):

log_id action table_name action_time product_id
NULL NULL NULL NULL NULL

我想创建一个触发器,当我们在"Orders"表中插入新行时,它将在Orders_log中生成一个新行,其中log_id=1...2...3...以及表"Orders"中的product_id=to product_id.因此,ORDERS_LOG将如下所示:

log_id action table_name action_time product_id
1 insert orders "now()" 103

我正在try 执行以下代码:

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’中时,它会给出错误"无法添加或更新子行:外键约束失败".

有人能帮我吗?

*编辑: 创建日志(log)表:

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;
```*

推荐答案

添加AUTO_INCREMENT后,可以从INSERT中移除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
log_id action table_name action_time product_id
1 insert orders 12:10:43 1

fiddle

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

同一类型对象之间的多对多关系

使用触发器markdown 10%

从MySQL JSON列中检索数组中的所有答案

无法连接到扩展坞MySQL Unix套接字

为什么 MAX 函数通过调用在 group 中生成正确的结果

我在连接到 mysql 的 node js 中收到错误消息发送到客户端后无法设置标头

如何使用等于、喜欢和不等于在 json 字段上编写查询?

任何值的 SQL WHERE 子句?

mySQL 中的主数据库和 IF 错误?

MySQL - 计算行重复的最大计数

MySQL 5.6 DATETIME 不接受毫秒/微秒

如何在 Laravel 5.1 中获取数据库中的表列表

你如何在 Node.js 中模拟 MySQL(没有 ORM)?

phpmyadmin没有收到要导入的数据错误,如何解决?

MySQL嵌套 Select 查询?

我的 PDO 声明不起作用

将sql查询的结果写入mysql中的文件

应该使用什么列类型将序列化数据存储在 mysql 数据库中?

MySQL中的base64编码