在更新触发器创建后我无法更新任何

After Creating after update trigger i cant update any

DROP TABLE IF EXISTS Sales;

CREATE TABLE Sales (
    id INT AUTO_INCREMENT,
    product VARCHAR(100) NOT NULL,
    quantity INT NOT NULL DEFAULT 0,
    fiscalYear SMALLINT NOT NULL,
    fiscalMonth TINYINT NOT NULL,
    CHECK(fiscalMonth >= 1 AND fiscalMonth <= 12),
    CHECK(fiscalYear BETWEEN 2000 and 2050),
    CHECK (quantity >=0),
    UNIQUE(product, fiscalYear, fiscalMonth),
    PRIMARY KEY(id)
);
DROP TABLE IF EXISTS log;

CREATE TABLE log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    text VARCHAR(100)
);

触发器

CREATE DEFINER=`root`@`localhost` TRIGGER `sales_AFTER_UPDATE` AFTER UPDATE ON `sales` 
FOR EACH ROW 
BEGIN
INSERT INTO log VALUES(NOW(),CONCAT('Update Student Record ', OLD.quantity));
END

UPDATE test for.sales SET quantity = 36 WHERE (id = 1);

ERROR 1136: 1136: Column count doesn't match value count at row 1

我是 mySQL 的新人,请帮忙

您应该在触发器的 INSERT 语句中明确指定列,因为您没有在一行中设置所有值(不包括自动递增的列)。

所以会是

INSERT INTO log(timestamp, text) VALUES (NOW(),CONCAT('Update Student Record ', OLD.quantity));

您有一些错误。 首先,根据您的触发器,您需要在日志 table 上添加另一列,如下所示

quantity INT NOT NULL DEFAULT 0

其次,不要像文本和时间戳一样使用Keywords and Reserved Words,这是一种不好的做法。如果这样做,请将其放在反引号内

第三个插入语句应该是

INSERT INTO log(`timestamp`,`text`,quantity) VALUES(NOW(),'Update Student Record', OLD.quantity);

不需要 CONCAT。

第四,

`sales` 

table和Salestable不一样,因为你用了反引号

下面的完整工作触发器:

DELIMITER //
CREATE  TRIGGER `sales_AFTER_UPDATE` AFTER UPDATE ON Sales
FOR EACH ROW 
BEGIN
INSERT INTO log(`timestamp`,`text`,quantity) VALUES(NOW(),'Update Student Record', OLD.quantity);
END//
DELIMITER ;

检查工作演示: https://www.db-fiddle.com/f/iqwShcHK3AGJvU4MDbxDku/0