簡體   English   中英

使用新舊表觸發,插入兩個表

[英]Trigger using old, new table, inserting into two tables

我是在 SQL 中創建觸發器並嘗試使這個觸發器工作(使用 Mysql)的新手。 它應該獲取博客條目的新(更新)版本並將其放入名為 EditedPosts 的表中,而只保留表 Posts 中的原始行不變。

我嘗試了幾種不同的方法,但無法使其正常工作。 有人有什么想法嗎?

我的觸發器:

DELIMITER $$ 
CREATE TRIGGER editedPost 
BEFORE UPDATE on Posts
for each row
begin
insert into editedPosts VALUES (PostID, Titel, Content, Created, UserName, BlogID) FROM new;
insert into Posts VALUES (PostID, Titel, Content, Created, UserName, BlogID) FROM old;

END $$
DELIMITER ;

我的表 帖子:

create table Posts (PostID INTEGER AUTO_INCREMENT not null,
                          Titel VARCHAR (50) not null,
                          Content TEXT not null,
                          Created timestamp DEFAULT current_timestamp,
                          UserName VARCHAR (50) not null,
                          BlogID INTEGER not null,
                          primary key (PostID),
                          foreign key(UserName) references User_Accounts(UserName),
                          foreign key (BlogID) REFERENCES Blogs (BlogID));

我的表已編輯帖子:

create table EditedPosts (EPostID INTEGER AUTO_INCREMENT not null,
                          PostID INTEGER not null,
                          Titel VARCHAR (50) not null,
                          Content TEXT not null,
                          Created timestamp,
                          Edited timestamp DEFAULT current_timestamp,
                          UserName VARCHAR (50) not null,
                          BlogID INTEGER not null,
                          primary key (EPostID),
                          foreign key (PostID) REFERENCES Posts(PostID),
                          foreign key(UserName) references User_Accounts(UserName),
                          foreign key (BlogID) REFERENCES Blogs (BlogID));

我會說這更常見於update后觸發器。 但這並沒有什么不同。

無論如何,您根本不需要更新 Posts 中的行。 然后你需要修復你的插入EditedPosts

DELIMITER $$ 
CREATE TRIGGER trg_post_update
BEFORE UPDATE on Posts
for each row
begin
    insert into editedPosts (PostID, Titld, Content, Created, UserName, BlogId)
        VALUES (new.PostID, new.Title, new.Content, new.Created, new.UserName, new.BlogID);
END $$
DELIMITER ;

實際上,如果您想保留原始值。 . . 而不是更新它們。

我不認為 MySQL 有一個instead of觸發器。 而且我認為沒有辦法在不產生錯誤的情況下阻止更新。 剩下的就是重新分配值:

DELIMITER $$ 
CREATE TRIGGER trg_post_update
BEFORE UPDATE on Posts
for each row
begin
    insert into editedPosts (PostID, Titld, Content, Created, UserName, BlogId)
        VALUES (new.PostID, new.Title, new.Content, new.Created, new.UserName, new.BlogID);

    set new.PostID = old.PostId,
        new.Title = old.Title,
        new.Content = old.Content,
        new.Created = old.Created,
        new.UserName = old.UserName,
        new.BlogID = old.BlogID;
END $$
DELIMITER ;

為此,您確實需要一個before update觸發器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM