我有一个数据库,用于存储用户发布的文章。所有者可以随时修改其文章。
我确实想添加一个备份功能,以防用户意外删除其文章的内容或在更新文章时出现其他问题。
因此,我有一个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
。我已经看到了关于如何实现副本的一些答案,但是这些答案似乎严格适用于
update
和insert
,并且似乎不适用于Replace
查询。我宁愿一个陈述而不是两个陈述,那是我遇到麻烦的地方。有没有办法在单个Replace语句中实现这种复制?
最佳答案
我也将支持放在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
,而是始终执行将旧值复制到INSERT
的backup_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/