在更新触发器创建后我无法更新任何
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和Sales
table不一样,因为你用了反引号
下面的完整工作触发器:
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
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
SETquantity
= 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和Sales
table不一样,因为你用了反引号
下面的完整工作触发器:
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