Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/05/2011, 10h43   #1
Invité de passage
 
debit
Inscription : février 2011
Messages : 10
Détails du profil
Informations personnelles :
Nom : debit

Informations forums :
Inscription : février 2011
Messages : 10
Points : 0
Points : 0
Par défaut Création de contrainte

salut à tous;

voilà, je suis débutant en SQL et je ne sais pas comment exprimer le fait que les dates de disponibilités d'un produit soient disjoints:
ma table est:

produit(num_produit, libele_prod, date_debut, date_fin, qtte)

Lors de la création de cette table, je voulais ajouter la contrainte citée en haut. J'ai pensé aux assertions et aux trigger, et je ne sais pas comment faire avec.

Merci d'avance.
borough est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 10h59   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Une simple contrainte CHECK suffit. A lire :
http://sqlpro.developpez.com/cours/s...partie2#L7.2.3
http://sqlpro.developpez.com/contrai...aintes_SQL.pdf

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 11h33   #3
Invité de passage
 
debit
Inscription : février 2011
Messages : 10
Détails du profil
Informations personnelles :
Nom : debit

Informations forums :
Inscription : février 2011
Messages : 10
Points : 0
Points : 0
Par défaut merci, mais...

Merci pour la réponse,

MAIS, je ne sais pas comment référencer la date de fin de disponibilité du dernier tuple avant l'insertion d'un autre pour un produit donné:

Code :
`date_fin` DATE NOT NULL CHECK ('date_debut' >= 'date_fin')
, ???

Ceci vérifie la contrainte uniquement au sein d'un même tuple, mais pas au sein de plusieurs tuples pour un produit donné.

en d'autres termes, voici les tuples que je voulais avoir dans ma table:

num_produit libele_produit date_debut date_fin
001 AAA 05/05/2003 20/05/2003
001 AAA 25/05/2003 05/06/2003
002 BBB 05/05/2003 30/05/2003
002 BBB 31/05/2003 06/06/2003

on remarque ici que les dates de disponibilité du produit '001' sont disjointes.

Merci de me répondre. Je dois au moins finir par la création des tables.
borough est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 14h02   #4
Membre expérimenté
 
Avatar de tumoo
 
Homme
Développeur informatique
Inscription : janvier 2011
Messages : 309
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France, Charente Maritime (Poitou Charente)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2011
Messages : 309
Points : 550
Points : 550
Salut

dans ce cas, je pense que ton schéma de base de données n'est pas bon (si nom_produit est ta clé primaire, il y a un problème dans ton exemple)

je ferais une table produit
Produit(nom_produit, libele_prod, id_dates)

et une table Date
Date(id, date_debut, date_fin)

ensuite une jointure dans ta requête pour récupérer ta liste de date

ça ne corrige pas ton problème mais je pense que ça sera plus facile comme ça
tumoo est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/05/2011, 14h07   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Citation:
Envoyé par borough Voir le message
Ceci vérifie la contrainte uniquement au sein d'un même tuple, mais pas au sein de plusieurs tuples pour un produit donné.
La contrainte peut porter sur le résultat d'une fonction utilisateur qui prendrait en argument les dates et le produit du tuple à tester. La supériorité de la fonction est qu'elle peut faire des requêtes SELECT dans le reste de la table.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 17h03   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Il suffit qu'il n'y ait pas de recouvrement de période pour un même "num_produit'.
Ceci se fait très bien avec la contrainte suivante :
Code :
1
2
3
4
5
6
ALTER TABLE produit  ADD CONSTRAINT CK_NON_RECOUVREMENT_PRODUIT
   CHECK (NOT EXISTS(SELECT *
                     FROM   produit AS T
                     WHERE  T.num_produit = num_produit
                       AND  NOT OVERLAPS(  date_debut,   date_fin, 
                                         T.date_debut, T.date_fin)));
Reste à savoir si votre SGBDR les supporte.
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 17h31   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Le schéma de la table est bon sur les dates, à part que libellé n'a rien à faire dans cette table (violation de la première forme normale). En revanche je ne l’appellerais pas Produit, mais par exemple dispo_produit, et je conserverais une table produit avec uniquement num_produit et le libellé.
La table dispo_produit ayant les colonnes num_produit, date_debut, date_fin, quantite.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 18h52   #8
Invité de passage
 
debit
Inscription : février 2011
Messages : 10
Détails du profil
Informations personnelles :
Nom : debit

Informations forums :
Inscription : février 2011
Messages : 10
Points : 0
Points : 0
Par défaut Merci

MERCIIII à tous ceux qui ont répondu à ma question. MERCI beaucoup.
borough est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 23h36   #9
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Je me suis amusé à traduire votre problème en un article sur la gestion des contraintes de recouvrement de période avec exemples pour SQL Server et PostGreSQL...
A lire : http://blog.developpez.com/sqlpro/p9...ecouvrement-p/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h05.


 
 
 
 
Partenaires

Hébergement Web