2016-04-26 9 views
0

ich eine Bibliotheksdatenbank erstellt haben und eine der Tabelle ist transaction die alsMysql-Trigger oder gespeicherte Prozedur Spalte A auf Aktualisierung der Spalte B in derselben Tabelle zu aktualisieren

folgt
CREATE TABLE action 
(
t_id int NOT NULL AUTO_INCREMENT, 
b_id int, 
m_id int, 
borrow_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
is_returned Bool Default 0, 
is_lost Bool, 
is_damaged Bool, 
return_timestamp TIMESTAMP, 
f_id int, 
PRIMARY KEY (t_id), 
CONSTRAINT fk_bookId FOREIGN KEY (b_id) REFERENCES book(b_id), 
CONSTRAINT fk_memberId FOREIGN KEY (m_id) REFERENCES member(m_id), 
CONSTRAINT fk_fineId FOREIGN KEY (f_id) REFERENCES fine(f_id) 
); 

I return_timestamp arrtibute aktualisieren möchten die mit dem Zeitstempel ist, wenn is_returned-1

geändert wird, habe ich versucht, diese

CREATE TRIGGER update_return_timestamp 
AFTER UPDATE 
ON action FOR EACH ROW 

BEGIN 
DECLARE return_timestamp timestamp; 

    SELECT is_returned FROM action 
    IF is_return IS 1 
     BEGIN 
      INSERT INTO transaction (return_timestamp) VALUES (now()) 
     END 
    COMMIT TRANSACTION 
END 

Wo gehe ich falsch? Oder was ist der richtige Ansatz? Ich weiß nicht, wie man das macht

+0

Funktioniert dieser Code überhaupt? Transaktion ist ein reserviertes Schlüsselwort http://dev.mysql.com/doc/refman/5.7/en/commit.html – e4c5

+0

ja es hat funktioniert .. Ich habe Tabelle mit dem obigen Code – Penny

+0

erstellt, aber bitte erwägen Sie, zu einem vernünftigeren zu ändern Tabellenname. Ihre Trigger-Funktion sieht sehr verwirrend aus, da Sie nicht erkennen können, ob Sie auf die Transaktionstabelle oder das darin enthaltene Transaktionsschlüsselwort verweisen. – e4c5

Antwort

1

Sie können Ihre Trigger vor der Aktualisierung des Datensatzes deklarieren. Wenn das neue Update is_returned Feld festgelegt, dann setzen Sie return_timestamp Feld.

CREATE TRIGGER update_return_timestamp 

BEFORE UPDATE ON `action` FOR EACH ROW 
BEGIN 

IF NEW.is_returned = 1 Then 
    Set NEW.return_timestamp = CURRENT_TIMESTAMP 
END IF; 

END 
Verwandte Themen