Est-ce la bonne façon de créer SQL affirmation?
afin de rendre ce type d'affirmation
create assertion assert
check "EMPTY SET" = (select User
from Video
where date=current_date()
group by user
having count(*) >= 10
cette affirmation est-elle de droite?
create assertion assert
check 0 = (select count(*)
from Video
where date=current_date()
group by user
having count(*) >= 10
Est la deuxième contrainte ne fonctionne pas? Ou demandez-vous si il ya une meilleure façon?
je me demande si c'est la bonne voie ou pas
je me demande si c'est la bonne voie ou pas
OriginalL'auteur user591931 | 2011-02-06
Vous devez vous connecter pour publier un commentaire.
Pour plus de détails sur
CREATE ASSERTION
voir l'ISO de la Norme SQL-92 spec.La
CHECK
définition devrait être entre parenthèses.CURRENT_DATE
n'a pas de parenthèses.USER
etDATE
sont des mots réservés.SQL doit être terminé par un caractère point-virgule.
SQL mots-clés doivent être en majuscules.
Essayer quelque chose de plus comme ceci:
Vous pouvez vérifier que la syntaxe est correcte à l'aide de la ligne Mimer SQL-92 Validateur. Cependant, vous devez également tester votre logique par exemple
CURRENT_DATE
est non-déterministe.Aussi, je ne pense pas que ce
ASSERTION
sera jamais à mordre. Lorsque la cardinalité de la sous-requête est inférieur à 10, il sera de retour à zéro des lignes et des0 = empty set
permettra d'évaluer àUNKNOWN
. Lorsque la cardinalité de la sous-requête est de 10 ou plus grande que la condition de recherche permettra d'évaluerTRUE
. Norme SQL-92 étatsRemarque: vous pouvez remplacer votre
CHECK (0 = (SELECT COUNT(*) FROM...))
construire avecCHECK (NOT EXISTS (SELECT * FROM...))
, dont le dernier je trouve plus facile à écrire.Mise à JOUR:
Comme je l'ai dit ci-dessus, votre logique semble erronée, il est difficile de mettre en œuvre correctement 😉
Disons que la règle est de limiter les Vidéos de 10 par utilisateur et par jour. Car cela implique un seul tableau, il serait plus approprié d'utiliser une table de niveau
CHECK
contrainte; cette contrainte est vérifiée lorsque le tableau est mis à jour, ce qui est suffisant dans ce cas (il n'y a aucune raison pourquoi il ne peut pas être unASSERTION
, bien que, en théorie, pourrait être vérifié à chaque fois tout table dans le schéma est mis à jour):Mise à JOUR 2:
Examiner à nouveau qu'un
CHECK
/ASSERTION
ne seront enregistrés que lorsque les données dans la table/schéma est mis à jour. Le problème avec l'aide deCURRENT_DATE
(et d'autres non-determninistic fonctions), dans une contrainte est que la règle d'entreprise, peut être invalidé par le simple compte à rebours a commencé au cours d'une période à l'autre, mais si les données n'a pas été changé dans cette période de l'intégrité des données ne sera pas détecté et la base de données contient des données non valides.Une autre question, est ce que l'on entend par année dans le contexte.
Il pourrait être l'année civile (du 1er janvier au 31 Décembre inclus) ou d'autres d'autres dates fixes définis par l'entreprise (par exemple, du 1er Avril au 31 mars inclusivement), dans lequel cas de groupement, par année et par utilisateur, puis comptage est trivial.
Plus intéressant lorsque les limites des règles de pointage pour tout période de 12 mois; l'extension à la fois le passé et l'avenir d'éviter les non-déterministe.
Envisager une standard approche de l'utilisation d'un auxiliaire de calendrier de table, contenant une ligne pour chaque jour applicable à l'entreprise, prolongée dans le passé et l'avenir, seulement dans la mesure requise devrait comporter quelques milliers de lignes. Chaque ligne doit avoir la date en tant que clé avec un deuxième colonne qui date de plus d'un an (et, si nécessaire, vous pourriez affiner la définition de "un an" lors d'une journée de granularité!) Le test pour impliquerait l'adhésion à l'Agenda de la table, le regroupement sur le calendrier la date et de l'utilisateur et de comptage par exemple quelque chose comme ceci:
Cela pourrait être mis dans une
CHECK (NOT EXISTS (...
contrainte. Cela pourrait encore être au niveau de la tableCHECK
contrainte: parce que le Calendrier de table est une table auxiliaire, il ne serait soumis à de rares contrôler les mises à jour (mais pourrait encore être unASSERTION
si nécessaire).merci,maintenant, disons que nous voulons limiter les vidéos de 100 par utilisateur et par an, dans ce cas, current_date serait nécessaire, ne serait-il pas?merci pour votre temps
OriginalL'auteur onedaywhen