2016-03-19 28 views
5

我有一個簡單的表格如下腳本。是否有可能在設計階段限制一個sql表格只有一行

CREATE TABLE dbo.KeyNumbers (
    RowId INT IDENTITY 
,ProFormaNumber NCHAR(10) NULL 
,SalesOrderNumber NCHAR(10) NULL 
,PurchaseOrderNumber NCHAR(10) NULL 
,InvoiceCreditNoteNumber NCHAR(10) NULL 
,InvoiceNumber NCHAR(10) NULL 
,PurchaseInvoiceCreditNoteNumber NCHAR(10) NULL 
,ModifiedDate DATETIME NULL 
,CONSTRAINT PK_KeyNumbers PRIMARY KEY CLUSTERED (RowId) 
) ON [PRIMARY] 

該表用於存儲公司的關鍵文件編號(發票編號,銷售訂單編號等),因此只需要一行。與此表的主要交互是通過存儲過程完成的,因此最終用途應該永遠不需要訪問它,但是我想知道是否有一種方法可以在SQL Server中主動限制表有一行,並且只有一行能夠在設計階段做到這一點。

編輯

證明了戈登的建議很好地工作

enter image description here

回答

6

最明顯的方法是使用一個觸發器在插入,以確保該表是空的。

我從來沒有嘗試過這一點,但在計算列的索引也可能工作:

alter table dbo.KeyNumbers add OneAndOnly as ('OneAndOnly'); 

alter table dbo.KeyNumbers add constraint unq_OneAndOnly unique (OneAndOnly); 

如果第二行插入這應該生成一個唯一鍵衝突。

+0

謝謝戈登。我將很快在一個新的數據庫和表格上嘗試這個,我會讓你知道的。 –

+0

精美的作品,謝謝。編輯過的問題來說明它的確存在。 –

2

- 我認爲這將是更清潔和利用現有的列

CREATE TABLE dbo.KeyNumbers (
    RowId AS (1) PERSISTED 
,ProFormaNumber NCHAR(10) NULL 
,SalesOrderNumber NCHAR(10) NULL 
,PurchaseOrderNumber NCHAR(10) NULL 
,InvoiceCreditNoteNumber NCHAR(10) NULL 
,InvoiceNumber NCHAR(10) NULL 
,PurchaseInvoiceCreditNoteNumber NCHAR(10) NULL 
,ModifiedDate DATETIME NULL 
,CONSTRAINT PK_KeyNumbers PRIMARY KEY CLUSTERED (RowId) 
) ON [PRIMARY] 
+0

。Vincent,感謝你的回答。在很多方面,我傾向於同意你的看法,認爲它的可讀性和簡單性,並且已經爲此標記了它。 Gordon的回答讓我看到了一個我以前沒有探究過的SQL領域,並在這個過程中學到了另一個新東西。 –

0

你也可以使用INSTEAD OF觸發器來實現相同..

create table test 
(
id int 
) 

create trigger dbo.test_trgr 
on dbo.test 
instead of insert 
as 
begin 
--here we check table rows,if there are no rows,iinsert..else ignore 
if not exists(select 1 from dbo.test) 
begin 

insert into dbo.test 
select * from inserted 

end 
0

定義的一列(任何列都可以)與:

  • a check約束,要求它是你最終想要的值
  • 一個unique約束

例如,如果你想id列具有價值1

create table mytable (
    id int check (id = 1) unique, 
    othercol1 text, 
    othercol2 int // etc 
) 

現在可以有最多1行必須有ID = 1

相關問題