为了确保在更改数据库时不会丢失数据,您可以创建脚本来确认新结构和旧结构包含相同的逻辑数据。例如,假设数据库的第一个版本看起来像这样(伪代码):
CREATE TABLE Customer
CustomerID INT,
FirstName string,
Surname string,
AddressLine1 string,
AddressLine2 string,
AddressLine3 string,
AddressLine4 string
在第二个版本中,您希望客户能够拥有多个地址,因此将地址字段移动到一个新表中:
CREATE TABLE Address
AddressID INT,
CustomerID INT,
AddressLine1 string,
AddressLine2 string,
AddressLine3 string,
AddressLine4 string
您可以像这样将客户表中的地址移动到新的地址表中:
INSERT Address
CustomerID ,
AddressLine1 ,
AddressLine2 ,
AddressLine3 ,
AddressLine4
SELECT
*
FROM Customer
然后,您可以从客户中删除冗余的地址字段:
ALTER TABLE Customer
DROP COLUMNS
AddressLine1 ,
AddressLine2 ,
AddressLine3 ,
AddressLine4
到目前为止一切都很好。但是我如何知道新的Address表包含与旧的Customer表完全相同的地址。整个过程很容易运行并以某种方式混淆地址,以便客户 effectively更改了彼此的地址。代码可能通过所有测试,但我们将破坏我们客户的数据,因为他们不再知道客户居住的地方。
我们可以通过运行以下命令来确认地址字段的移动是否有效
如果返回任何记录,则升级失败,因为某些客户未能将其地址移动:
SELECT
*
FROM
OldCustomerTable OCT LEFT JOIN Address A
ON OCT.CustomerID = A.CustomerID
WHERE
A.CustomerID IS NULL
如果返回任何记录,则升级失败,因为地址已被混淆。
SELECT
*
FROM
OldCustomerTable OCT INNER JOIN Address A
ON OCT.CustomerID = A.CustomerID
WHERE
OCT.Address1 != A.Address1
OR OCT.Address2 != A.Address2
OR OCT.Address3 != A.Address3
或 OCT.Address4 != A.Address4
你还可以检查新地址表是否只包含每个客户的1个地址
SELECT
CustomerID
, COUNT(AddressID)
FROM
Address
GROUP BY
CustomerID
HAVING
COUNT(AddressID) >1