IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Clef primaire avec contrainte [2008]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    En formation JAVA
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : En formation JAVA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Par défaut Clef primaire avec contrainte
    Bonjour,

    Je doit créer une table avec ces contrainte pour la clé primaire :
    Un projet a un code unique, La valeur de ce code est gérée par le système sur 4 caractères numériques : composé pour les deux premiers par l’année en cours et sur les deux derniers par un numéro séquentiel +1 à partir du dernier connu.

    Je n'ai pas encor trouver de solution merci.

  2. #2
    Membre expérimenté Avatar de ccambier
    Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2006
    Messages : 256
    Par défaut
    Bonjour,

    Un projet a un code unique, La valeur de ce code est gérée par le système sur 4 caractères numériques : composé pour les deux premiers par l’année en cours et sur les deux derniers par un numéro séquentiel +1 à partir du dernier connu.
    Le nombre d'occurrence de vos projets sera fortement limité !? gros risque de se retrouver bloqué après 100 projets dans la même année !

    Ensuite, il serait intéressant de voir comment est alimenté cette clé primaire ? par programmation en envoyée tel quel à l'INSERT ?

    Est-ce que c'est une contrainte CHECK que vous voulez mettre en place?

  3. #3
    Membre averti
    Homme Profil pro
    En formation JAVA
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : En formation JAVA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Par défaut
    Le nombre de projet est inférieur à 100 sur une année pas de souci de ce coté là, le problème se pose pour concaténer l'année sur 2 chiffre et un incrément automatique, le nombre de caractères peut varié je pense pas que ça soit impossible.

    La demande est de le faire directement sur la base de donnée en SQL et en automatique, soit par une fonction qui existerai déjà sinon en en créant une.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Il faut créer une table de compteur et utiliser une procédure associé.
    Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/clefs/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre expérimenté Avatar de ccambier
    Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2006
    Messages : 256
    Par défaut
    Dans votre cas ça me semble tout de même spécifique

    Alors vou pouvez créer une fonction scalaire SQL qui retourne votre valeur calculée.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE FUNCTION DBO.TESTFUNCTION ()
    RETURNS INT
    AS 
    BEGIN 
    	DECLARE @TEST AS INT
    	SELECT @TEST = 1301
     
    	RETURN @TEST
    END 
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO MESPROJETS (NUMPROJET)
    VALUES (DBO.TESTFUNCTION ())
    il faut simplement que la valeur retournée par la fonction scalaire soit du même type que la valeur de la colonne.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par jc_mar Voir le message
    Bonjour,

    Je doit créer une table avec ces contrainte pour la clé primaire :
    Un projet a un code unique, La valeur de ce code est gérée par le système sur 4 caractères numériques : composé pour les deux premiers par l’année en cours et sur les deux derniers par un numéro séquentiel +1 à partir du dernier connu.

    Je n'ai pas encor trouver de solution merci.
    Qui est le système ?
    SQL Server même ou le logicielle connecté ?

  7. #7
    Membre expérimenté Avatar de ccambier
    Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2006
    Messages : 256
    Par défaut
    d'après ce que j'ai compris le "système" fait référence au serveur SQL

  8. #8
    Membre averti
    Homme Profil pro
    En formation JAVA
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : En formation JAVA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Par défaut
    Oui "Système" = SQL Server 2008

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Comme conseillé par SQLPro, on peut créer la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE sequence_projet
    (
    	sequence_projet tinyint NOT NULL
    )
    GO
     
    INSERT INTO dbo.sequence_projet (sequence_projet) VALUES (0)
    GO
    Et je suppose par la suite que votre table de projets ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE projet
    (
    	cle smallint
    		CONSTRAINT PK_projet PRIMARY KEY
    		CONSTRAINT CHK_projet_cle CHECK (cle LIKE '[0-9][0-9][0-9][0-9]')
    	, nom_projet varchar(32) NOT NULL
    		CONSTRAINT UQ_projet__nom_projet UNIQUE
    	, autres_colonnes varchar(64)
    )
    GO
    Et voici la procédure stockée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    CREATE PROCEDURE projet_ajoute
    	@_nom_projet varchar(32)
    	, @_autres_colonnes varchar(64)
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @num_projet tinyint
     
    	BEGIN TRY
    		BEGIN TRANSACTION
    			UPDATE	dbo.sequence_projet
    			SET	@num_projet = sequence_projet = sequence_projet + 1
     
    			INSERT	INTO dbo.projet
    			(
    				cle
    				, nom_projet
    				, autres_colonnes
    			)
    			SELECT	RIGHT(YEAR(GETDATE()), 2)
    					+ CASE LEN(@num_projet)
    						WHEN 1 THEN '0' + CAST(@num_projet AS char(1))
    						ELSE CAST(@num_projet AS char(2))
    					END
    				, @_nom_projet
    				, @_autres_colonnes
    		COMMIT TRANSACTION
    	END TRY
    	BEGIN CATCH
    		DECLARE @err_msg nvarchar(2048) = ERROR_MESSAGE()
    			, @err_svy int = ERROR_SEVERITY()
    			, @err_st int = ERROR_STATE()
     
    		IF XACT_STATE() <> 0
    		BEGIN
    			ROLLBACK TRANSACTION
    		END
     
    		RAISERROR(@err_msg, @err_svy, @err_st)
    	END CATCH
    END
    Si nous réalisons les deux appels suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    EXEC dbo.projet_ajoute
    	@_nom_projet = 'mon premier projet'
    	, @_autres_colonnes = 'toto'
     
    EXEC dbo.projet_ajoute
    	@_nom_projet = 'mon second projet'
    	, @_autres_colonnes = 'titi'
    Nous obtenons :



    @++

  10. #10
    Membre averti
    Homme Profil pro
    En formation JAVA
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : En formation JAVA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Par défaut
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. insertion avec contrainte sur clef primaire ?
    Par panthere noire dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 20/02/2012, 14h52
  2. [AC-2003] Clef Primaire avec ADOX
    Par Bonero dans le forum Modélisation
    Réponses: 4
    Dernier message: 19/08/2011, 15h41
  3. update contrainte clef primaire
    Par Damish dans le forum Langage SQL
    Réponses: 1
    Dernier message: 29/09/2006, 22h35
  4. Clef primaire access, Indexé avec doublon
    Par Asurmena dans le forum Access
    Réponses: 1
    Dernier message: 05/06/2006, 11h04
  5. Réponses: 4
    Dernier message: 08/03/2006, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo