为了确保在更改数据库时不会丢失数据,您可以创建脚本来确认新结构和旧结构包含相同的逻辑数据。例如,假设版本 1 的数据库看起来像这样(伪代码)
CREATE TABLE Customer
CustomerID INT,
FirstName string,
Surname string,
AddressLine1 string,
AddressLine2 string,
AddressLine3 string,
AddressLine4 string
在版本 2 中,您希望能够允许客户拥有多个地址,因此您将地址字段移动到新表中:
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
到目前为止一切顺利。但是我怎么知道新的地址表包含与旧的客户表完全相同的地址。整个过程很容易运行并以某种方式打乱地址,以便客户有效地相互更改地址。该代码可以通过所有测试,但我们将销毁我们的客户数据,因为他们不再知道他们的客户住在哪里。
我们可以通过运行确认地址字段的移动工作
如果这返回任何记录,则升级失败,因为一些客户没有移动他们的地址:
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
OR OCT.Address4 != A.Address4
您还可以检查新地址表是否仅包含每个客户的 1 个地址
SELECT
CustomerID
, COUNT(AddressID)
FROM
Address
GROUP BY
CustomerID
HAVING
COUNT(AddressID) >1