2016-03-19 15 views
5

Mam prostą tabelę, jak opisano poniżej.Czy można ograniczyć tabelę sql, aby mieć tylko jeden wiersz na etapie projektowania

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] 

tabela służy do przechowywania kluczowych numerów dokumentów (numer faktury, numer zlecenia itp) dla firmy, i jako takie wymaga tylko jeden wiersz. Główna interakcja z tą tabelą odbywa się za pomocą procedur przechowywanych, więc użycie końcowe nigdy nie musi mieć do niej dostępu, ale zastanawiam się, czy istnieje sposób na serwerze SQL, aby aktywnie ograniczyć tabelę do jednego i tylko jednego wiersza oraz do być w stanie to zrobić na etapie projektowania.

EDIT

Dowód, że propozycja Gordona działa ładnie

enter image description here

Odpowiedz

6

Oczywistym metoda wykorzystuje spust na wkładce mieć pewność, że stół jest pusty.

Nigdy nie próbowałem tego, ale indeks na kolumnie komputerowej może również pracować:

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

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

ten powinien wygenerować unikalny klucz naruszenie jeśli drugi rząd jest włożona.

+0

Dziękuję Gordon. Mam zamiar szybko wypróbować to na nowej bazie danych i stole, a dam ci znać. –

+0

Działa pięknie, dziękuję. Zmieniono pytanie, aby to zilustrować. –

2

--i że to byłoby czystsze i wykorzystuje istniejące kolumny

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, dziękuję za odpowiedź. Pod wieloma względami skłaniam się do wyrażenia zgody na to, czy jest to czytelność i jej prostota, i zaznaczyłem to z tego powodu. Odpowiedź Gordona otworzyła mi oczy na obszar SQL, którego wcześniej nie poznałem, i inne nowe rzeczy, których się nauczyłem. –

0

Można także użyć zamiast spustu osiągnąć to samo ..

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

Definiowanie jednej z kolumn (każdy kolumna zrobi) z:

  • o check ograniczenia, zobowiązując ją za wartość, którą ostatecznie ma
  • unique ograniczenie

Na przykład, jeśli chcesz kolumna id mieć wartość 1:

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

Teraz nie może być co najwyżej 1 wiersz i musi mieć id = 1