2009-05-28 48 views
3

我已經看過一些網頁搜索和對此的迴應,但看起來它們都涉及到視圖。我如何製作允許爲空或唯一序列的列

如何調整列以便它只允許NULL或唯一值?

在我的情況下,有一個股票項目表,其中只有服務器項目有一個序列號。其餘的都是空的。我想對輸入相同的連續劇進行某種控制。

另外,我不能重新設計架構,因爲我正在爲一個靜態網站寫一個新的前端。

+3

您正在使用哪種RDBMS? – Quassnoi 2009-05-28 15:08:06

+0

Microsoft SQL Server(僅適用於我的可通過Visual Studio訪問) – 2009-05-29 06:38:51

回答

0

你能從前端驗證嗎?在插入或提交數據之前,請確保它是唯一的或NULL。

+0

我正在執行此操作以保持其清潔,這是最簡單的解決方案 – 2009-06-02 07:38:43

+0

始終有良好的數據庫規則 - 您不應該僅僅依靠數據的前端完整性。腰帶+大括號。 – niico 2017-04-28 08:01:52

6

在MySQL中,也可爲空的UNIQUE列允許任意數量的空值(在所有引擎中)。所以,如果您使用的是MySQL,只需在感興趣的列中添加一個UNIQUE約束即可。這種行爲是SQL標準,PostgreSQL和SQLite也支持這種行爲(顯然Oracle只對單列UNIQUE約束,儘管我無法證實這一點)。

但是,此SQL標準行爲不一定適用於所有其他RDBMS引擎,如SQL Server或DB2;如果您指定了需要支持的引擎,我們可能會提供更具體的建議。

+0

PostgreSQL也支持這種行爲。 – 2009-12-03 14:51:46

4

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 
0

你可以用一個觸發器,而不是做...

指數列,但沒有一個唯一約束 允許空值 棒觸發在INSERT和UPDATE上的表上,你檢查你試圖插入的列值是NULL還是表中不存在

0

我不知道你用什麼數據庫g,但是在Postgres中,你可以定義一個「插入或更新之前」的觸發器,它可以返回一個特殊的值來拒絕插入。如果沒有原生的方式來執行它,你可以用它在你的表上強制執行一個這樣的約束。

0

這是什麼平臺?

對於SQL Server,請參閱此blog post,其中顯示了使用索引視圖的技術。

2

如果您使用MS SQL Server ,那麼您可以使用過濾的唯一索引來實現此目的。有關詳細信息,請參閱this forum thread

0

對於Sql Server 2008,這裏是由MattB鏈接的過濾索引解決方案的副本。我在這裏寫下它以確保人們不會錯過它:

CREATE UNIQUE NONCLUSTERED INDEX [UniqueExceptNulls] 
ON [Customers] (SSN) 
WHERE [SSN] IS NOT NULL