SQL更新撤消

Bal*_*aji 18 sql undo sql-update

有没有办法可以撤消SQL更新查询?

mar*_*cgg 18

除非你在反式行动中运行它,否则你不能.

根据您的DBMS事务将以不同方式处理,因此请阅读文档.例如,使用mysql,它是如何进行的:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

使用Postresql:

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
-- etc etc
COMMIT;
Run Code Online (Sandbox Code Playgroud)

使用TSQL:

DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'MyTransaction'
BEGIN TRANSACTION @TranName
GO
USE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
GO
COMMIT TRANSACTION MyTransaction
GO
Run Code Online (Sandbox Code Playgroud)

还有一些操作无法放入事务中,但在大多数数据库管理系统中,您现在可以找到应该能够回滚的操作update.

最后,如果您保留数据库中发生的所有事情的精确日志,您始终可以撤消更新,但这是另一个故事.


Ken*_*ams 6

SQL Server不支持开箱即用,但在某些情况下,可以通过读取事务日志来恢复数据.如果数据库处于完全恢复模式并且需要第三方工具(如ApexSQL LogLog Rescue),则此方法有效.还有一种使用DBCC LOG命令读取t-log的方法,但它可能会变得太难.

您还可以查看以下讨论的主题:

如何在SQL Server 2005中回滚UPDATE查询?

阅读SQL Server 2008中的日志文件(*.LDF)


And*_*ite 5

如果在事务中运行更新,则可以回滚事务.

SQL Server:

begin transaction

update [Table] set col1 = 'test' where Id = 3

rollback transaction
Run Code Online (Sandbox Code Playgroud)

另一种技术可能是向表中添加更新触发器,并且无论何时更新记录,都将先前的值保存到"历史"表中.如果大量使用此表,这可能是也可能不是一个好主意.