強制使用不同數量的尾隨空格
我正在將基於 SQL Anywhere (ASA) 5.5 的應用程序及其數據庫轉換為 Microsoft SQL Server。
Existing 是一個主鍵聚集在兩列上的表,
code_type char(4)
並且code char(30)
. 我能夠很好地建構表格,但是嘗試移動數據時遇到了衝突,因為表格包含 (‘cha’, ‘’) 和 (‘cha’, ‘’) 並且與另一個開發人員交談聽起來像這有一個案例。不是真的想重新培訓使用者,有什麼選項可以在數據庫級別強制執行不同數量的空間?該數據庫用於單個應用程序,因此最終我可以依靠控制數據如何插入表中,但希望在表定義中強制執行預期的區別。
如果 (‘cha’, ‘’) 存在於表中,我希望能夠插入 (‘cha’, ’ ‘) 因為它有更多的尾隨空格,但不是 (‘cha’, ‘’) 因為它具有與現有條目相同數量的空格 (0)。
這個關於 UNIQUE Index的問題概述了唯一索引的行為,SQL 在根據 ANSI/ISO SQL-92 第 8.2 節一般規則 #3 進行比較之前,應用正確的空格填充以使兩個字元串大小相等。我已經使用
char
作為連結的類型確認了這種行為varchar
。我不承諾使用密鑰,只是以某種方式強制執行不同數量的尾隨空格。有相當多的字元保證不會出現在第二列中。該欄位是字母縮寫或法律文件引用。法律文件引用似乎包含字母數字字元加上’(’、’)’、’-’、’.’、‘‘和’/’。
我不會稱這是一個好的解決方案,但它似乎有效。您可以創建帶有附加字元的計算列,
code_type
並在計算列上創建唯一索引。對於附加的字元,如果您想避免做出這樣的假設,您可以使用永遠不會出現在您的數據中的字元或任何長度至少為 31 個字元的字元串。通過一個例子可能是最容易的。這是您遇到的問題:
CREATE TABLE dbo.T226714 ( code_type CHAR(4) NOT NULL, code VARCHAR(30) NOT NULL, PRIMARY KEY (code_type, code) ); -- fails due to PK error INSERT INTO dbo.T226714 VALUES ('cha', ' '); INSERT INTO dbo.T226714 VALUES ('cha', '');
相反,請執行以下操作:
DROP TABLE dbo.T226714; CREATE TABLE dbo.T226714 ( code_type CHAR(4) NOT NULL, code VARCHAR(30) NOT NULL, code_with_end_char AS CAST(code + 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ' AS VARCHAR(61)) ); CREATE UNIQUE INDEX UI ON dbo.T226714 (code_type, code_with_end_char); -- works INSERT INTO dbo.T226714 VALUES ('cha', ' '); INSERT INTO dbo.T226714 VALUES ('cha', ''); -- can't insert this as a third row due to the unique index: INSERT INTO dbo.T226714 VALUES ('cha', ' ');