【问题标题】:Trigger using old, new table, inserting into two tables使用新旧表触发,插入两个表
【发布时间】:2021-05-25 04:06:24
【问题描述】:

我是在 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));

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    我会说这更常见于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 触发器。

    【讨论】:

    • 供您输入。如你所说,Mysql中没有instead of trigger,所以我之前一直在使用。如果我重新分配您在第二个触发器中显示的值,那是否会将旧值移动到 EditedPosts 而不是将它们保留在原始 Posts 表中?我希望将新的(已编辑的)输入存储在 EditedPosts 中。
    • 创建触发器以从 Posts 表中收集某些类型的数据并从头开始在“Edited Posts”表中创建编辑可能更容易吗?
    • @SoX 。 . .不,它不会那样做。新值进入editedPosts之前它们被改变。
    • 非常感谢,终于搞定了!你是明星!
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多