Nein, aber Sie können eine gespeicherte Prozedur erstellen, die diese beiden Dinge ausführt und sie dann in einer einzigen Anweisung ausführt.
create procedure GiveThisABetterName
(
in pKey int,
in newNumber int,
in currentNumber int,
in newName varchar(100)
)
begin
update
article
set
Name = newName, Number = newNumber
where
pKey = pKey;
insert into dif (pKey, Number) values (pKey, newNumber);
end
Meine MySQL-Syntax ist rostig, aber das sollte in der Nähe sein. Dann, wenn Sie wollen, um es auszuführen:
call GiveThisABetterName(12, 15, 22, 'Some Name');
EDIT: Nach der Frage erneut zu lesen, scheint es mir, dass Sie versuchen, Ihr Datenmodell Spur Audit-Informationen zu machen, dass es einfach nicht natürlich aufnehmen einzurichten. Haben Sie die Kontrolle über das Modell? Wenn ja, sollten Sie so etwas wie dies (siehe here für ein funktionierendes Beispiel von dem, was unten):
CREATE TABLE IF NOT EXISTS article (
pKey smallint(3) unsigned NOT NULL AUTO_INCREMENT,
Name varchar(80) COLLATE utf8_roman_ci NOT NULL,
PRIMARY KEY (pKey)
);
CREATE TABLE ArticleNumbers
(
Counter int UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pKey SMALLINT(3) UNSIGNED NOT NULL,
Number SMALLINT(3) DEFAULT 0 NOT NULL,
Difference SMALLINT(3)
);
ALTER TABLE ArticleNumbers
ADD CONSTRAINT ArticleNumbers_article_pKey_fk
FOREIGN KEY (pKey) REFERENCES article (pKey) ON UPDATE CASCADE;
Vielleicht ein paar Ansichten hinzufügen, um die Dinge einfacher zu machen:
CREATE VIEW GroupedArticleNumbers
as
select pKey, max(Counter) as Counter
from ArticleNumbers
group by pKey;
CREATE VIEW CurrentArticles
as
select article.pKey, article.Name, numbers.Number, numbers.Difference
from article
left outer join GroupedArticleNumbers filter on article.pKey = filter.pKey
left outer join ArticleNumbers numbers on filter.Counter = numbers.Counter;
Da Sie die Nummer separat verfolgen Aus dem Basisdatensatz können Sie jetzt aber noch leicht ermitteln, um welche aktuelle Zahl es sich handelt, Sie können nun Ihre Update- und Insert-Statement-Funktionalität kombinieren. Siehe unten.
Zunächst einige Testdaten:
insert into article (Name) values ('Test');
insert into ArticleNumbers (pKey, Number, Difference) values (1, 10, null);
insert into ArticleNumbers (pKey, Number, Difference) select 1, 20, 20 - Number from CurrentArticles where pKey = 1;
insert into ArticleNumbers (pKey, Number, Difference) select 1, 50, 50 - Number from CurrentArticles where pKey = 1;
insert into ArticleNumbers (pKey, Number, Difference) select 1, 15, 15 - Number from CurrentArticles where pKey = 1;
Sehen Sie, wie schön, dass das Schema der Einrichtung, sobald den Kopf klappt getan worden?
Um die aktuelle Nummer für den Artikel erhalten wir erstellt:
select * from currentarticles where pKey = 1
Um die Anzahl der Geschichte für diesen Artikel zu erhalten:
select * from article
left outer join articlenumbers on article.pkey = articlenumbers.pkey
order by counter asc
Wenn Sie zu Chaos mit Ihrem Datenmodell bereit sind, Sie können eine Alternative zu gespeicherten Prozeduren haben.
Alternativ, wenn Sie Trigger verwenden möchten als @Jonathan Leffler vorgeschlagen, so etwas wie dies funktionieren sollte:
CREATE TABLE article (
pKey smallint(3) unsigned NOT NULL AUTO_INCREMENT,
Name varchar(80) COLLATE utf8_roman_ci NOT NULL,
Number SMALLINT(3) DEFAULT 0 NOT NULL,
PRIMARY KEY (pKey)
);
CREATE TABLE ArticleNumbers
(
Counter int UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pKey SMALLINT(3) UNSIGNED NOT NULL,
Number SMALLINT(3) DEFAULT 0 NOT NULL,
Difference SMALLINT(3)
);
delimiter $
create trigger tr_u_article
before update on article
for each row
begin
insert into ArticleNumbers (pKey, Number, Difference) select old.pKey, new.Number, new.Number - old.Number
end;
delimiter ;
nur eine gespeicherte Prozedur machen, die eine Transaktion hat. Für den Aufrufer ist es eine Abfrage – Drew
Müssen Sie [einen Trigger erstellen] (https://dev.mysql.com/doc/refman/5.7/en/create-trigger.html) auf der Tabelle aktualisiert werden, wo die Aktion ist in die andere Tabelle einzufügen? –