我建議改變這個設計。任何時候做分裂字符串以獲取字符串內「隱藏」字段都是必要的,這違反了使用關係數據庫的基本原則之一,即一行中的每個字段應存儲單個值。這可以工作嗎?大概。這樣做是個好主意嗎?不是在我看來。
正如其他人指出的,有幾種方法來改變設計。可以將一列添加到客戶表中以指示客戶被鎖定。可以使用包含CustomerID和經理ID的單獨表格(例如CustomerLocked) - 這將允許添加附加信息,例如客戶被鎖定的時間等,如果有人鎖定客戶,然後離開他們的辦公桌。
我相信任何這些變化都能滿足要求。例如,假設一個LockedCustomer表創建:
Table LockedCustomer
CustomerID NUMBER PRIMARY KEY
ManagerID VARCHAR
AddDate DATE
,讓我們說,一個經理已經鎖定客戶的111,222,333;因此在LockedCustomer表中的以下行會存在:
CustomerID ManagerID
111 A
222 A
333 A
現在走來經理B,誰願意來鎖定客戶222的應用程序管理器B的使用嘗試插入新行到LockedCustomer表,如下:
INSERT INTO LockedCustomer (CustomerID, ManagerID)
VALUES (222, 'B');
這種說法應該失敗,因爲客戶ID 222已經在表中存在,並且CustomerID列是LockedCustomer主鍵。這是有道理的,因爲我們只想在任何時間點在LockedCustomer表中最多一次存在給定的CustomerID。應用程序管理器B正在使用可以檢測到INSERT由於主鍵約束違規而失敗,並且會理解這意味着此時客戶無法被鎖定。通過重新查詢LockedCustomer表額外的數據,如:
SELECT *
FROM LockedCustomer
WHERE CustomerID = 222
應用程序可以顯示一個對話框,以管理者B可能看起來像
The customer you wished to edit (222) is currently in use
by Manager A since 03-Jun-2011 2:17 PM. Would you like to
A) Wait
B) Send an email to Manager A
C) Take a long vacation
D) Violate company policy regarding alcohol consumption
during working hours
Please select one of the above options?
分享和享受。
我認爲你應該創建一個'SelectedCustomers' **表**而不是一個在CustomerId上使用唯一約束/主鍵來保存ManagerId和CustomerId的列。然後,如果CustomerId存在或不存在,那麼檢查針對該表的查詢應該是微不足道的。 – 2011-06-09 09:18:24
正確的方法是創建一個LockedCustomers表,每個鎖定的客戶有一個條目。你在做什麼是不好的做法。 – 2011-06-09 09:19:15