Question

Je voudrais limiter les entrées dans un tableau. Disons dans la table tBoss . Existe-t-il une contrainte SQL qui vérifie combien de n-uplets sont actuellement dans la table? Comme

SELECT COUNT(*) from tBoss < 2

Firebird dit:

  

Jeton invalide.   Erreur SQL dynamique.   Code d'erreur SQL = -104.   Jeton inconnu - ligne 3, colonne 8.   SELECT.

Merci. Norbert

Était-ce utile?

La solution

Votre base de données a-t-elle des déclencheurs? Si tel est le cas, ajoutez un déclencheur qui annule toute insertion qui ajouterait plus de 2 lignes ...

Create Trigger MyTrigName
For Insert On tBoss
As
    If (Select Count(*) From tBoss) > 2
       RollBack Transaction

mais pour répondre directement à votre question, le prédicat que vous souhaitez est de placer simplement la sous-requête select entre parenthèses. comme ça ...

  [First part of sql statement ]
  Where (SELECT COUNT(*) from tBoss) < 2

Autres conseils

Vous pouvez le faire avec une contrainte de vérification et une fonction scalaire. Voici comment j'ai construit un exemple.

Créez d'abord une table:

CREATE TABLE MyTable
 (
   MyTableId  int           not null  identity(1,1)
  ,MyName     varchar(100)  not null
 )

Créez ensuite une fonction pour cette table. (Vous pouvez peut-être ajouter la limite du nombre de lignes en tant que paramètre si vous souhaitez plus de flexibilité.)

CREATE FUNCTION dbo.MyTableRowCount()
RETURNS int
AS
 BEGIN
    DECLARE @HowMany int

    SELECT @HowMany = count(*)
      from MyTable
    RETURN @HowMany
 END

Ajoutez maintenant une contrainte de vérification utilisant cette fonction à la table

ALTER TABLE MyTable
 add constraint CK_MyTable__TwoRowsMax
  check (dbo.MyTableRowCount() < 3)

Et testez-le:

INSERT MyTable (MyName) values ('Row one')
INSERT MyTable (MyName) values ('Row two')
INSERT MyTable (MyName) values ('Row three')
INSERT MyTable (MyName) values ('Row four')

Un inconvénient est que chaque fois que vous insérez dans la table, vous devez exécuter la fonction et effectuer une analyse de table ... mais quoi, la table (avec index clusterisé) occupe au maximum deux pages. Le vrai inconvénient, c’est que ça a l'air plutôt bizarre ... mais tout a l'air bizarre quand on ne comprend pas pourquoi cela doit être ainsi.

(La solution de déclenchement fonctionnerait, mais j'aime éviter les déclencheurs autant que possible.)

Pour trouver des multiples dans une base de données, votre meilleur pari est une sous-requête, par exemple: (Remarque: je suppose que vous cherchez à trouver des lignes dupliquées d'une certaine sorte)

  

SELECT id de tBoss WHERE id IN (CHOISIR id de tBoss GROUP BY id HAVING count (*) > 1)

où id est la colonne éventuellement dupliquée

SELECT COUNT(*) FROM tBoss WHERE someField < 2 GROUP BY someUniqueField
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top