Recherche de la contrainte SQL: SELECT COUNT (*) from tBoss < 2
-
06-07-2019 - |
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
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