Ich habe eine MySQL-Datenbank mit einer Tabelle inventory
mit mehreren Triggern eingerichtet, um Änderungen in einer zweiten Tabelle inventory_history
zu erfassen. Ich aktualisiere zwei der Felder (sowohl in einer einzigen Abfrage als auch in zwei separaten Abfragen), und der Auslöser arbeitet konsistent nur an einem der beiden Felder (qty
, aber nicht an last_sale
). HierMySQL Trigger funktioniert auf einem Feld, nicht auf dem zweiten Feld, in der gleichen Tabelle
ist die lästige Abfrage:
UPDATE inventory SET last_sale = 321, qty = 0 WHERE id = 123;
Alternativ diese Abfrage Kombinationen nicht funktionieren entweder:
UPDATE inventory SET last_sale = 321 WHERE id = 123;
UPDATE inventory SET qty = 0 WHERE id = 123;
Hier die Tabellenkonstrukte sind und löst:
CREATE TABLE `inventory` (
`serial_no` varchar(255) DEFAULT NULL,
`qty` mediumint(9) DEFAULT NULL,
`partid` mediumint(9) unsigned DEFAULT NULL,
`last_sale` mediumint(9) unsigned DEFAULT NULL,
`date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`id` mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `partid` (`partid`),
KEY `date_created` (`date_created`),
KEY `last_sale` (`last_sale`),
KEY `last_rma` (`last_return`),
KEY `last_purchase` (`last_purchase`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `inventory_history` (
`date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`inventory_id` mediumint(9) unsigned NOT NULL,
`field_changed` enum('serial_no','qty','partid','last_sale','new') NOT NULL,
`changed_from` varchar(255) NOT NULL,
KEY `inventory_id` (`inventory_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TRIGGER `inv_new` AFTER INSERT ON `inventory`
FOR EACH ROW BEGIN
SET
@id = NEW.id,
@userid = NEW.userid,
@date = now();
INSERT INTO inventory_history VALUES (@date,@userid, @id, 'new', 'new');
END
//
DELIMITER ;
DROP TRIGGER IF EXISTS `inv_update`;
DELIMITER //
CREATE TRIGGER `inv_update` AFTER UPDATE ON `inventory`
FOR EACH ROW BEGIN
SET @userid = OLD.userid;
SET @inv_id = OLD.id;
IF (OLD.serial_no <> NEW.serial_no) THEN
INSERT INTO inventory_history VALUES (now(), @userid, @inv_id, 'serial_no', OLD.serial_no);
END IF;
IF (OLD.qty <> NEW.qty) THEN
INSERT INTO inventory_history VALUES (now(), @userid, @inv_id, 'qty', OLD.qty);
END IF;
IF (OLD.partid <> NEW.partid) THEN
INSERT INTO inventory_history VALUES (now(), @userid, @inv_id, 'partid', OLD.partid);
END IF;
IF (OLD.last_sale <> NEW.last_sale) THEN
INSERT INTO inventory_history VALUES (now(), @userid, @inv_id, 'last_sale', OLD.last_sale);
END IF;
END
//
DELIMITER ;
Also wieder funktioniert der qty
Trigger, aber die last_sale
nicht.
seltsam, es scheint keine Probleme mit Ihrem Code zu geben, werde es selbst ausprobieren –