如何在同一个表上更新后更新触发器中的表列?
这是触发器:
CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score
FOR EACH ROW
UPDATE
products_score
SET
products_score.votes_total =
(SELECT
(votes_1 + votes_2 + votes_3 + votes_4 + votes_5)
FROM
products_score
WHERE
id = new.id)
现在当我更新表格时
UPDATE products_score SET votes_1 = 5 WHERE id = 0
这不起作用,因为我得到以下内容:
#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
那么我怎么能让这个工作呢?
在我的数据库中,我有一个Employee具有递归关联的表(员工可以是其他员工的老板):
create table if not exists `employee` (
`SSN` varchar(64) not null,
`name` varchar(64) default null,
`designation` varchar(128) not null,
`MSSN` varchar(64) default null,
primary key (`ssn`),
constraint `fk_manager_employee` foreign key (`mssn`) references employee(ssn)
) engine=innodb default charset=latin1;
Run Code Online (Sandbox Code Playgroud)
mysql> describe Employee;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| SSN | varchar(64) | NO | PRI | NULL | |
| name | varchar(64) | YES | | NULL | …Run Code Online (Sandbox Code Playgroud) 我试图在我的数据库中创建两个TIMESTAMP列时遇到了问题.一个叫created,一个叫updated.我认为很容易将两者的默认值设置为CURRENT_TIMESTAMP然后ON UPDATE CURRENT_TIMESTAMP为updated列.但由于某些原因,MySQL意味着这是一个坏主意...所以我一直在寻找方法来做到这一点,而无需在插入查询中设置其中一个.
我在这个答案中通过使用触发器找到了一种方法,但我一直在收到错误.我只是设法实际创建了触发器,但是当我尝试插入声称具有该功能的新行时,我现在遇到错误
1442 - 无法更新存储函数/触发器中的表'tasks',因为它已被调用此存储函数/触发器的语句使用.
我根本没有得到这意味着什么.所以,我希望有人可以在这个问题上取得一些启示.
我用来创建表和触发器的SQL如下:
CREATE TABLE `tasks` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`created` DATETIME,
`updated` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`title` VARCHAR(255) NOT NULL,
`notes` TEXT,
`status_id` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
KEY `status_id` (`status_id`),
CONSTRAINT `fk_tasks_statuses` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TRIGGER task_creation_timestamp AFTER INSERT ON tasks
FOR EACH …Run Code Online (Sandbox Code Playgroud) 我想设置一个触发器,以便在更新时预测字段为= 3,然后触发器将值更改为4并将其保存在数据库中.触发器如下.
出于某种原因,我不断收到错误说:
#1442 - Can't update table 'tzanalytic\_forecast\_cached' in stored
function/trigger because it is already used by statement which invoked
this stored function/trigger.
Run Code Online (Sandbox Code Playgroud)
这是正确的方式吗?
delimiter $$
CREATE TRIGGER no_BoW BEFORE UPDATE ON t FOR EACH ROW
BEGIN set @prediction = new.prediction;
UPDATE t SET t.prediction = (SELECT IF(@prediction = '3', '4', @prediction)) WHERE t.event_id = new.event_id AND t.price_tier = new.price_tier; END;
$$ delimiter ;
Run Code Online (Sandbox Code Playgroud) 我有一个树(嵌套类别)存储如下:
CREATE TABLE `category` (
`category_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`category_name` varchar(100) NOT NULL,
`parent_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`category_id`),
UNIQUE KEY `category_name_UNIQUE` (`category_name`,`parent_id`),
KEY `fk_category_category1` (`parent_id`,`category_id`),
CONSTRAINT `fk_category_category1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`category_id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
Run Code Online (Sandbox Code Playgroud)
我需要用节点信息(子+父)提供我的客户端语言(PHP),以便它可以在内存中构建树.我可以调整我的PHP代码,但我认为如果我能按照所有父母在他们的孩子面前的顺序检索行,那么操作会更简单.如果我知道每个节点的级别,我就可以这样做:
SELECT category_id, category_name, parent_id
FROM category
ORDER BY level -- No `level` column so far :(
Run Code Online (Sandbox Code Playgroud)
你能想出一种方法(视图,存储例程或其他......)来计算节点级别吗?我想如果它不是实时的,我可以在节点修改时重新计算它.
我根据Amarghosh的反馈写了这些触发器:
DROP TRIGGER IF EXISTS `category_before_insert`;
DELIMITER //
CREATE TRIGGER `category_before_insert` …Run Code Online (Sandbox Code Playgroud) 嗯,我已经找了很多地方在互联网上的原因mysql error #1442,其称
无法在存储的函数/触发器中更新表'unlucky_table',因为它已被调用此存储函数/触发器的语句使用
有人说这是mysql中的一个错误或它没有提供的功能.
MySQL触发器无法操纵它们分配给的表.所有其他主要DBMS都支持此功能,因此希望MySQL能够尽快添加此支持.
有人声称这是由于插入记录时的递归行为 ,mysql正在做一些锁定的东西.你不能插入/更新/删除你插入的同一个表的行..因为然后触发器会一次又一次地调用..最终在一个递归
在插入/更新期间,您可以访问包含所涉及表中所有字段的NEW对象.如果在插入/更新之前执行a并在新对象中编辑要更改的字段,它将成为调用语句的一部分,而不是单独执行(消除递归)
现在我无法理解为什么这是递归的.我在我有2代表的情况下table1和table2与我运行SQL查询如
update table1 set avail = 0 where id in (select id from table2 where duration < now() - interval 2 hour);
Run Code Online (Sandbox Code Playgroud)
现在我有一个after update trigger关于table1为
CREATE TRIGGER trig_table1 AFTER UPDATE ON table1
FOR EACH ROW begin
if old.avail=1 and new.avail=0 then
delete from table2 where id=new.id;
end if;
Run Code Online (Sandbox Code Playgroud)
现在,当我执行更新查询时,我得到1442错误.在这种情况下递归是什么?
is this error a lack of feature in mysql?
OR …Run Code Online (Sandbox Code Playgroud) 我有一个表SCHEDULES_CLASS,其中2个字段是CLASS_ID(CLASS表中的外键),STATUS以及NUMBER_OF_ENROLLED_STUDENTS.我有其他表CLASS有一个字段作为MAX_SEATS.
当NUMBER_OF_ENROLLED_STUDENTS预定班级等于MAX_SEATS相应CLASS 的可用班级时,我需要将其状态SCHEDULES_CLASS从初始状态"打开" 更改为"已满".
我为此创建了一个触发器,如下所示:
USE mydb;
DELIMITER ##
dROP TRIGGER IF EXISTS updateClassStatusTrigger ##
CREATE TRIGGER updateClassStatusTrigger
BEFORE UPDATE ON SCHEDULED_CLASS
FOR EACH ROW
BEGIN
UPDATE SCHEDULED_CLASS SET STATUS="FULL" WHERE CLASS_ID=NEW.CLASS_ID
AND EXISTS (SELECT 1 FROM SCHEDULED_CLASS sc, CLASS cl WHERE cl.CLASS_ID=NEW.CLASS_ID AND NEW.NUMBER_OF_ENROLLED_STUDENTS=cl.MAX_SEATS);
END##
Run Code Online (Sandbox Code Playgroud)
我正在使用phpmyadmin,当在SCHEDULED_CLASS表上发生任何更新时,我收到以下错误:
#1442 - Can't update table 'SCHEDULED_CLASS' in stored function/trigger because it is already used by statement which …Run Code Online (Sandbox Code Playgroud) 我有一个名为 的表teamMembers,该表存储了一个人的姓名和电子邮件地址:
id INT (UNIQUE, AUTOINCREMENT)
name VARCHAR(255)
email VARCHAR(255)
updated DATETIME
created TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
我已经使用创建了我的触发器phpMyAdmin,它在这个导出中看起来像这样:
CREATE TRIGGER teamMembers.updated_updater
AFTER UPDATE ON teamMembers
FOR EACH ROW
BEGIN
UPDATE teamMembers SET updated = NOW() WHERE id = OLD.id;
END
Run Code Online (Sandbox Code Playgroud)
因此,当我使用这样的查询时:
UPDATE teamMembers SET name = 'test' WHERE id = 1
我应该将更新的列设置为当前日期时间。
但这不起作用,我收到此错误消息:
#1442 - 无法更新存储函数/触发器中的表“teamMembers”,因为它已被调用此存储函数/触发器的语句使用。
我真的无法弄清楚这里的问题是什么。我认为这是因为这个触发器也会调用自己,因此会成为一个无限循环。我认为必须有一种方法可以在不更改查询的情况下自动更新刚刚更新的记录。
有人可以帮助我使用 MySQL 触发器更新到updated列吗?
我有一个表存储父和子记录.
我试图创建一个触发器,删除父项时删除所有子记录:
Delete From tbl Where ParentId = OLD.Id
Run Code Online (Sandbox Code Playgroud)
虽然我可以成功保存触发器,但在删除时我收到此错误:
错误1442:无法更新存储的函数/触发器中的表'tbl',因为它已被调用此语句的语句使用
我究竟做错了什么?
我有一个我想要的表:更新表后,该表的 2 个字段(标题和描述)会发生变化并从另一个表中获取值
这是我的触发器:
drop trigger trigger_trade_request ;
CREATE TRIGGER trigger_trade_request AFTER UPDATE ON `trade_request`
FOR EACH ROW
BEGIN
IF NEW.title = null THEN
UPDATE `trade_request_type`,`trade_request`
SET NEW.title = `trade_request_type`.title ,
NEW.description = `trade_request_type`.description
WHERE `trade_request_type`.id = NEW.trade_request_typeId;
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
我的桌子:
错误:
错误 1442:无法更新存储函数/触发器中的表“trade_request”,因为它已被调用此存储函数/触发器的语句使用。
这是行不通的!有什么问题吗?