Bonjour,
comment faire pour limiter une entrée dans une base à 4 éléments max par exemple. J'aimerais faire ça
create table A (
numero int,
check ((select count(numero) from A)<=4)
);
Mais on ne peut faire des sous-requetes dans une creation de base. Comment peut on faire ? Merci
A+
# houlà......
Posté par fcartegnie . Évalué à 3.
create temporary table A ( z ENUM('0','1','2','3') , numero int, primary key(z) );
# Tordu
Posté par pyrollo (site web personnel) . Évalué à 1.
La première solution qui me vient à l'esprit, c'est un champ numériqe unique non null avec une contrainte check "compris entre 1 et 4".
Une fois créé les enregistrement comportant les valeurs 1, 2, 3 et 4, il ne te sera plus possible d'inserrer quoi que ce soit d'autre (la clé unique assure qu'on ne réutilise pas deux fois le même numéro et le not null t'oblige à mettre un numéro).
[^] # juste une précision sur ce que je souhaite en fait
Posté par cppuser . Évalué à 1.
merci beaucoup je me suis mal exprimé, je souhaite par exemple que le 1 ne puisse pas se retrouver plus de 4 fois dans la table, idem pour le 7, le 45...le but étant de limiter les emprunts (cela revient à ça en fait). Sinon je pensais à un trigger qui compte (via une fonction ?) et indique si c'est bon ou pas (mais comme je ne maitrise ni les triggers ni les fonctions en SQL, vive le C ;-) ).
J'espère que cette information précise mieux le but de ma demande. Merci
Cordialement
[^] # Re: juste une précision sur ce que je souhaite en fait
Posté par gaaaaaAab . Évalué à 1.
Le SQL "pur" est très bien pour gérer des cardinalités de type 0,1, n (pour n quelconque).
Par contre, c'est pas du tout adapté quand on veut fixer des valeurs de n.
En SQL "pas pur" ;) faut voir ... quel SGBD utilises-tu ?
[^] # Re: juste une précision sur ce que je souhaite en fait
Posté par Jean B . Évalué à 3.
En gros créer un trigger qui compte le nombre d'enregistrements identiques et interromps le commit si nécessaire.
(la divison par zéro c'est pour MySQL, avec un autre SGBD tu peut lever une erreur proprement)
CREATE TRIGGER check_limit_4
BEFORE INSERT ON my_table
FOR EACH ROW BEGIN
DECLARE sim_count AS INT;
SELECT count(*)
INTO sim_count
FROM my_table
WHERE my_field = :new.my_field
IF sim_count > 3 THEN 1 /0;
END
Mais bon si tu maîtrise totalement la partie applicative, je serait toi je ne m'embêterait pas avec du SQL à moins que ce soit critique.
[^] # Re: juste une précision sur ce que je souhaite en fait
Posté par pyrollo (site web personnel) . Évalué à 3.
Sous d'autres bases, je pense qu'il est probable d'avoir le même problème mais c'est à vérifier.
Pour revenir à ma "solution" de départ, pour l'adapter, il suffit de modifier la clé unique pour qu'elle porte sur deux champs : le champ qui numérote de 1 à 4 et l'autre champ.
Par contre, c'est assez bizarre de vouloir faire cela, ça sonne comme une erreur de conception de ton modèle de base de donnée.
# Merci à tous
Posté par cppuser . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.