2016-03-19 16 views
5

Ho una tabella semplice come script di seguito.È possibile limitare una tabella sql a una sola riga in fase di progettazione

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] 

La tabella viene utilizzata per memorizzare i numeri dei documenti chiave (numero di fattura, numero ordine di vendita, ecc) per l'azienda, e come tale richiede solo una singola riga. L'interazione principale con questa tabella avviene attraverso stored procedure, quindi l'uso finale non dovrebbe mai aver bisogno di accedervi, ma mi chiedo se esiste un modo in SQL Server per limitare attivamente la tabella ad avere una sola riga e solo una essere in grado di farlo in fase di progettazione.

EDIT

La prova che il suggerimento di Gordon funziona bene

enter image description here

risposta

6

Il metodo ovvio utilizza un trigger su Inserisci per essere sicuri che la tabella è vuota.

ho mai provato questo, ma un indice su una colonna calcolata potrebbe anche funzionare:

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

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

Questo dovrebbe generare una violazione di chiave unica, se si inserisce una seconda fila.

+0

Grazie, Gordon. Proverò rapidamente questo nuovo database e tabella e ti farò sapere. –

+0

Funziona magnificamente, grazie. Ho modificato la domanda per illustrare che lo fa. –

2

--I che questo sarebbe più pulito e utilizza le colonne esistenti

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, grazie per la tua risposta. In molti modi propendo di essere d'accordo con te sulla sua leggibilità e sulla sua semplicità, e l'ho marcato per questo motivo. La risposta di Gordon mi ha aperto gli occhi su un'area di SQL che non avevo mai esplorato prima e un'altra cosa nuova appresa nel processo. –

0

si potrebbe anche usare al posto del grilletto per ottenere lo stesso ..

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

Definire una delle colonne (qualsiasi colonna farà) con:

  • un vincolo check, che richiede che sia il valore che alla fine si desidera
  • un unique vincolo

Ad esempio, se si vuole che la colonna id di avere valore 1:

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

Ora non ci può essere al massimo 1 riga e si deve avere id = 1.

Problemi correlati