我有一个数据库,用于存储用户发布的文章。所有者可以随时修改其文章。

我确实想添加一个备份功能,以防用户意外删除其文章的内容或在更新文章时出现其他问题。

因此,我有一个content列,用于存储文章的内容,还有一个backup_content,用于在上一次更新之前保留内容的副本。

用户具有“还原”按钮,该按钮用于将新内容替换为备份。非常类似于“撤消”功能。

我准备插入/更新文章的声明如下:

REPLACE INTO custom_pages (name, banner_url, full_url, backup_content, content, updated_on) VALUES (?, ?, ?, content, ?, CURRENT_TIMESTAMP);


在这里,我尝试将先前的content值放入backup_content,然后用新值更改content。这样做会将backup_content设置为NULL

我已经看到了关于如何实现副本的一些答案,但是这些答案似乎严格适用于updateinsert,并且似乎不适用于Replace查询。我宁愿一个陈述而不是两个陈述,那是我遇到麻烦的地方。

有没有办法在单个Replace语句中实现这种复制?

mysql - 将字段复制到“替换为”之前的列中-LMLPHP

最佳答案

我也将支持放在Gordon Linoff's suggestion后面,您可以通过触发器和一对多相关表来创建连续更新历史记录。

但是,如果当前对您而言不可行的重大架构更改,则可以实现您尝试的with INSERT INTO...ON DUPLICATE KEY UPDATE功能,而不是较早的REPLACE INTO功能。

使用REPLACE INTO...SELECT FROM可能导致对该表的索引进行一次以上的访问,但是INSERT INTO...ON DUPLICATE KEY UPDATE只能访问一次。

由于name具有唯一索引,因此可以假定您从不尝试使用UPDATE,而是始终执行将旧值复制到INSERTbackup_content

-- Inserting a row which does not yet exist..
INSERT INTO custom_pages (name, banner_url, full_url, content)
  VALUES ('uniquename', 'http://example.com', 'http://example.com', 'this is the original content');



-- In practice, you use this format:
-- uniquename already exists, so update necessary fields
INSERT INTO custom_pages (name, banner_url, full_url, content)
  VALUES ('uniquename', 'http://example.com', 'http://example.com', 'this is new content')
  ON DUPLICATE KEY UPDATE
    -- Update from the VALUES() list
    banner_url = VALUES(banner_url),
    -- Set backup_content to old content BEFORE updating
    -- content from VALUES()
    backup_content = content,
    content = VALUES(content),
    updated_on = NOW();


使用此方法,如果没有INSERT子句,则永远不会使用第一个ON DUPLICATE KEY语句。相反,请始终使用第二个。将创建通过唯一键不存在的行,将更新已经存在的行。

它在起作用:http://sqlfiddle.com/#!9/2f687/1

关于mysql - 将字段复制到“替换为”之前的列中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34119884/

10-13 09:49
查看更多