7
votes

Est-il possible de limiter une table SQL à seulement avoir une seule ligne au stade de la conception

J'ai une table simple comme scriptée ci-dessous.

    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]


0 commentaires

4 Réponses :


7
votes

La méthode évidente utilise un déclencheur sur INSERT pour être sûr que la table est vide.

Je n'ai jamais essayé cela, mais un index sur une colonne calculée peut également fonctionner: P>

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

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


2 commentaires

Merci Gordon. Je vais essayer rapidement cela sur une nouvelle base de données et une nouvelle table et je vous ferai savoir.


Fonctionne magnifiquement, merci. Ont édité la question pour illustrer que cela fait.



2
votes

- Je pense que cela serait plus propre et utilise les colonnes existantes

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]


1 commentaires

.Vincent, merci de votre réponse.Là de nombreuses façons d'accepter de convenir avec vous à propos de sa lisibilité et de sa simplicité, et de la marquer pour cette raison. La réponse de Gordon a ouvert les yeux sur une région de SQL que je n'envisais pas auparavant et une autre nouvelle chose apprise dans le processus.



0
votes

Vous pouvez également utiliser au lieu de déclencher pour accomplir la même ..

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 commentaires

0
votes

Définissez une des colonnes (toute colonne fera) avec:

  • A Vérifiez la contrainte , nécessitant qu'elle est la valeur que vous voulez finalement
  • A Unique contrainte

    par exemple, si vous souhaitez que la colonne ID doit avoir une valeur 1 : xxx

    Maintenant, il peut y avoir au plus 1 rangée et il doit avoir ID = 1.


0 commentaires