使用恢复的数据库中的值和匹配的 ID 更新当前数据库
Updating current database with values from restored database and matching IDs
我的游戏有一个 table,叫做 monsterClass。
这是一个非常简单的 table,包含这些列:
id
monsterName
monsterMapYear
monsterTreasure
locationId
这里是示例数据:
[ 1 | 'Orc' | 5000 | 'gold' | 2932 ]
[ 2 | 'Goblin' | 6000 | 'silver' | 4611 ]
[ 3 | 'Red Dragon' | 3000 | 'gems' | 8573 ]
等等
好吧,愚蠢的我很快就尝试用新的 monsterMapYear (7000) 更新一组特定的怪物,混合了各种名称的怪物。
我确实将所需的怪物集设置为具有 7000 的 monsterMapYear。但是我无意中将所有其他怪物(不在我想更改的集中)设置为 NULL 的 monsterMapYear。
所以我将以前的备份恢复到一个新数据库,所以我拥有了我不小心覆盖的数据。
现在我正在尝试进行更新,以将 NULL 值更新为之前我将所有内容搞砸之前设置的值。
到目前为止,这是我的查询:
UPDATE Game_Production.dbo.monsterClass
SET monsterMapYear = (
SELECT monsterMapYear
FROM TMP_RESTORE_Game.dbo.monsterClass
WHERE monsterMapYear <> 7000
AND monsterMapYear IS NOT NULL
)
但我不确定如何将生产数据库中怪物的 ID 与临时恢复数据库中的怪物 ID 匹配。
有没有办法做到这一点并且安全地 运行 这个查询?
谢谢!
您应该可以使用 id
:
UPDATE newdata
SET monsterMapYear = olddata.monsterMapYear
FROM TMP_RESTORE_Game.dbo.monsterClass olddata JOIN
Game_Production.dbo.monsterClass newdata
ON olddata.id = newdata.id
WHERE newdata.monsterMapYear IS NULL OR
newdata.monsterMapYear <> olddata.monsterMapYear;
未来参考:在进行更新之前将您的更新放入 "Begin Transaction" "Rollback Transaction" 块中进行测试。
BEGIN TRANSACTION
--Print out existing data
SELECT * FROM monsterClass
--Count the rows in the monsterClass table
SELECT COUNT(*) FROM monsterClass
--Update the data - Please check the number of rows updated versus the row count in the existing monster class printed earlier
your update statement goes here
--Print out the updated data
SELECT * FROM monterClass
--Undo the changes
ROLLBACK TRANSACTION
此时,您可以验证您的更新工作正常。当数据更新正确并且你想更新 table 时,将 "ROLLBACK TRANSACTION" 更改为 "COMMIT TRANSACTION" 并重新 运行 SQL 查询批处理。
我的游戏有一个 table,叫做 monsterClass。
这是一个非常简单的 table,包含这些列:
id
monsterName
monsterMapYear
monsterTreasure
locationId
这里是示例数据:
[ 1 | 'Orc' | 5000 | 'gold' | 2932 ]
[ 2 | 'Goblin' | 6000 | 'silver' | 4611 ]
[ 3 | 'Red Dragon' | 3000 | 'gems' | 8573 ]
等等
好吧,愚蠢的我很快就尝试用新的 monsterMapYear (7000) 更新一组特定的怪物,混合了各种名称的怪物。
我确实将所需的怪物集设置为具有 7000 的 monsterMapYear。但是我无意中将所有其他怪物(不在我想更改的集中)设置为 NULL 的 monsterMapYear。
所以我将以前的备份恢复到一个新数据库,所以我拥有了我不小心覆盖的数据。
现在我正在尝试进行更新,以将 NULL 值更新为之前我将所有内容搞砸之前设置的值。
到目前为止,这是我的查询:
UPDATE Game_Production.dbo.monsterClass
SET monsterMapYear = (
SELECT monsterMapYear
FROM TMP_RESTORE_Game.dbo.monsterClass
WHERE monsterMapYear <> 7000
AND monsterMapYear IS NOT NULL
)
但我不确定如何将生产数据库中怪物的 ID 与临时恢复数据库中的怪物 ID 匹配。
有没有办法做到这一点并且安全地 运行 这个查询?
谢谢!
您应该可以使用 id
:
UPDATE newdata
SET monsterMapYear = olddata.monsterMapYear
FROM TMP_RESTORE_Game.dbo.monsterClass olddata JOIN
Game_Production.dbo.monsterClass newdata
ON olddata.id = newdata.id
WHERE newdata.monsterMapYear IS NULL OR
newdata.monsterMapYear <> olddata.monsterMapYear;
未来参考:在进行更新之前将您的更新放入 "Begin Transaction" "Rollback Transaction" 块中进行测试。
BEGIN TRANSACTION
--Print out existing data
SELECT * FROM monsterClass
--Count the rows in the monsterClass table
SELECT COUNT(*) FROM monsterClass
--Update the data - Please check the number of rows updated versus the row count in the existing monster class printed earlier
your update statement goes here
--Print out the updated data
SELECT * FROM monterClass
--Undo the changes
ROLLBACK TRANSACTION
此时,您可以验证您的更新工作正常。当数据更新正确并且你想更新 table 时,将 "ROLLBACK TRANSACTION" 更改为 "COMMIT TRANSACTION" 并重新 运行 SQL 查询批处理。