我已經看過一些網頁搜索和對此的迴應,但看起來它們都涉及到視圖。我如何製作允許爲空或唯一序列的列
如何調整列以便它只允許NULL或唯一值?
在我的情況下,有一個股票項目表,其中只有服務器項目有一個序列號。其餘的都是空的。我想對輸入相同的連續劇進行某種控制。
另外,我不能重新設計架構,因爲我正在爲一個靜態網站寫一個新的前端。
我已經看過一些網頁搜索和對此的迴應,但看起來它們都涉及到視圖。我如何製作允許爲空或唯一序列的列
如何調整列以便它只允許NULL或唯一值?
在我的情況下,有一個股票項目表,其中只有服務器項目有一個序列號。其餘的都是空的。我想對輸入相同的連續劇進行某種控制。
另外,我不能重新設計架構,因爲我正在爲一個靜態網站寫一個新的前端。
你能從前端驗證嗎?在插入或提交數據之前,請確保它是唯一的或NULL。
我正在執行此操作以保持其清潔,這是最簡單的解決方案 – 2009-06-02 07:38:43
始終有良好的數據庫規則 - 您不應該僅僅依靠數據的前端完整性。腰帶+大括號。 – niico 2017-04-28 08:01:52
在MySQL中,也可爲空的UNIQUE
列允許任意數量的空值(在所有引擎中)。所以,如果您使用的是MySQL,只需在感興趣的列中添加一個UNIQUE約束即可。這種行爲是SQL標準,PostgreSQL和SQLite也支持這種行爲(顯然Oracle只對單列UNIQUE
約束,儘管我無法證實這一點)。
但是,此SQL標準行爲不一定適用於所有其他RDBMS引擎,如SQL Server或DB2;如果您指定了需要支持的引擎,我們可能會提供更具體的建議。
PostgreSQL也支持這種行爲。 – 2009-12-03 14:51:46
SQL Server
允許創建UNIQUE
索引接受NULL
值,儘管它需要一些小技巧。
創建一個只選擇非NULL
列的視圖,並在視圖上創建UNIQUE INDEX
:
CREATE VIEW myview
AS
SELECT *
FROM mytable
WHERE mycolumn IS NOT NULL
CREATE UNIQUE INDEX ux_myview_mycolumn ON myview (mycolumn)
注意,您需要在視圖而不是表執行INSERT
的和UPDATE
的。
您可以用INSTEAD OF
觸發做到這一點:
CREATE TRIGGER trg_mytable_insert ON mytable
INSTEAD OF INSERT
AS
BEGIN
INSERT
INTO myview
SELECT *
FROM inserted
END
你可以用一個觸發器,而不是做...
指數列,但沒有一個唯一約束 允許空值 棒觸發在INSERT和UPDATE上的表上,你檢查你試圖插入的列值是NULL還是表中不存在
我不知道你用什麼數據庫g,但是在Postgres中,你可以定義一個「插入或更新之前」的觸發器,它可以返回一個特殊的值來拒絕插入。如果沒有原生的方式來執行它,你可以用它在你的表上強制執行一個這樣的約束。
這是什麼平臺?
對於SQL Server,請參閱此blog post,其中顯示了使用索引視圖的技術。
如果您使用MS SQL Server ,那麼您可以使用過濾的唯一索引來實現此目的。有關詳細信息,請參閱this forum thread。
對於Sql Server 2008,這裏是由MattB鏈接的過濾索引解決方案的副本。我在這裏寫下它以確保人們不會錯過它:
CREATE UNIQUE NONCLUSTERED INDEX [UniqueExceptNulls]
ON [Customers] (SSN)
WHERE [SSN] IS NOT NULL
您正在使用哪種RDBMS? – Quassnoi 2009-05-28 15:08:06
Microsoft SQL Server(僅適用於我的可通過Visual Studio訪問) – 2009-05-29 06:38:51