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

MS SQL Server Discussion :

incrémentation automatique d'une colonne


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Par défaut incrémentation automatique d'une colonne
    * Bonjour, *

    j'ai crée une table programme sous SQL Server et je cherche a modifier la colonne numprg pour qu'elle soit incrémenté automatiquement..bon j'ai lu cet article http://blog.developpez.com/sqlpro/p6...ec-sql-server/ mais j'ai pas trouvé qu'est ce qu'on doit écrire avec Alter table pas Create table.
    j'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table programme alter column Numprg int IDENTITY;
    mais un erreur se produit.
    merci d'avance..

  2. #2
    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 : 43
    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,

    Effectivement c’est impossible, et c'est tout à fait normal : on ne peut pas demander tout d'un coup à SQL Server de calculer la valeur, puis de ne plus la calculer, puis de recommencer à la calculer, ...

    Vous avez trois solutions :

    - Soit la table ne contient aucune ligne et n'est référencée par aucune autre, et vous la recréez

    - Soit dans le même cas, vous faites un clic droit sur la table > conception, et vous spécifiez que cette colonne doit avoir la propriété d'auto-incrémentation



    Et vous laissez faire SQL Server Management Studio, qui recréera la table

    - Soit votre table a des lignes et elle est référencée par d'autres tables, et là c'est pas un cadeau : il vous faut désactiver toutes les contraintes sur toutes les tables qui référencent celle-ci, ce que vous pouvez vous générer en exécutant :

    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
    SELECT		'ALTER TABLE ' + PS.name + '.' + PT.name
    		+ ' NOCHECK CONSTRAINT ' + FK.name AS foreign_key_name
    FROM		sys.schemas AS PS
    INNER JOIN	sys.foreign_keys AS FK
    			ON PS.schema_id = FK.schema_id
    INNER JOIN	sys.foreign_key_columns AS FKC
    			ON FK.object_id = FKC.constraint_object_id
    INNER JOIN	sys.tables AS PT
    			ON FK.parent_object_id = PT.object_id
    INNER JOIN	sys.columns AS PC
    			ON FKC.parent_object_id = PC.object_id
    			AND FKC.parent_column_id = PC.column_id
    INNER JOIN	sys.tables AS RT
    			ON FK.referenced_object_id = RT.object_id
    INNER JOIN	sys.columns AS RC
    			ON FKC.referenced_object_id = RC.object_id
    			AND FKC.referenced_column_id = RC.column_id
    INNER JOIN	sys.schemas AS RS
    			ON RT.schema_id = RS.schema_id
    WHERE		1 = 1
    AND		RS.name = 'dbo'
    AND		RT.name = 'programme '
    Puis recréer votre table avec la propriété d'auto-incrémentation pour la colonne Numprg, puis réactiver toutes les contraintes.
    Pour générer le code de réactivation :

    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
    SELECT		'ALTER TABLE ' + PS.name + '.' + PT.name
    		+ ' WITH CHECK CHECK CONSTRAINT ' + FK.name AS foreign_key_name
    FROM		sys.schemas AS PS
    INNER JOIN	sys.foreign_keys AS FK
    			ON PS.schema_id = FK.schema_id
    INNER JOIN	sys.foreign_key_columns AS FKC
    			ON FK.object_id = FKC.constraint_object_id
    INNER JOIN	sys.tables AS PT
    			ON FK.parent_object_id = PT.object_id
    INNER JOIN	sys.columns AS PC
    			ON FKC.parent_object_id = PC.object_id
    			AND FKC.parent_column_id = PC.column_id
    INNER JOIN	sys.tables AS RT
    			ON FK.referenced_object_id = RT.object_id
    INNER JOIN	sys.columns AS RC
    			ON FKC.referenced_object_id = RC.object_id
    			AND FKC.referenced_column_id = RC.column_id
    INNER JOIN	sys.schemas AS RS
    			ON RT.schema_id = RS.schema_id
    WHERE		1 = 1
    AND		RS.name = 'dbo'
    AND		RT.name = 'programme'
    Le code est inspiré de la requête que j'ai publié ici

    @++

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Par défaut remerciement
    merci bien pour ton aide ça marche pour la colonne NumPrg mais j'ai une autre colonne NumPc dans une table PièceComptable qui doit étre incrémentée mensuellement selon le RibRip.

    par exemple:

    mois----------------RibRip-------------NumPc
    Janvier------------- 012345------------ 1
    Janvier------------- 012345------------ 2
    Janvier------------- 543210------------ 1
    Janvier------------- 012345------------ 3
    Janvier------------- 543210------------ 2
    Fevrier------------- 012345------------ 1

    qu'est ce que je dois faire?
    Images attachées Images attachées  

  4. #4
    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 : 43
    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
    qu'est ce que je dois faire?
    Hé bien commencer par chercher un petit peu
    Et si vous êtes planté, alors posez votre question sur le forum !

    Essayez :

    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
    DECLARE @t TABLE
    (
    	NumP int identity
    	, mois varchar(10)
    	, RibRip char(6)
    	, NumPC tinyint
    )
     
    INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '012345')
    INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '012345')
    INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '543210')
    INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '012345')
    INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '543210')
    INSERT	INTO @t (mois, RibRip) VALUES ('Fevrier', '012345')
     
    ------------------------------------------------------------------
     
    ;WITH
    	CTE AS
    	(
    		SELECT	NumP
    			, mois
    			, RibRip
    			, ROW_NUMBER() OVER(PARTITION BY mois, RibRip ORDER BY NumP) AS NumPC
    		FROM	@t
    	)
    UPDATE		T
    SET		NumPC = C.NumPC
    FROM		@t AS T
    INNER JOIN	CTE AS C ON T.NumP = C.NumP
     
    SELECT	*
    FROM	@t
    La variable de type TABLE est une représentation de votre table utilisateur.
    L'UPDATE se fait sur la base de la clé primaire

    @++

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Par défaut
    Hé bien commencer par chercher un petit peu
    Et si vous êtes planté, alors posez votre question sur le forum !

    Oui sincèrement j'ai cherché et j'ai lu quelques tutoriels concernant les variables de table et les tables temporaires aussi et c'est la première fois que je les face car j'utilise SQL Server nouvellement avec une application web .net comme un projet fin d'étude et vraiment j'ai pas assez du temps pour plus rechercher bon j'ai exécuté ton script et il me donne la résultat désirée mais j'ai pas trouvé comment je l'enregistre et comment je l'appelle pour incrémenter NumP de la table PieceComptable!

    je sais bien que c'est honteux mais sincèrement j'ai besoin de l'aide ..
    et merci pour tout

  6. #6
    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 : 43
    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
    Il n'y a aucune honte à ne pas savoir

    ui sincèrement j'ai cherché et j'ai lu quelques tutoriels concernant les variables de table et les tables temporaires
    Attention : j'ai utilisé une variable de type TABLE seulement pour l'exemple.

    Donc vous devez remplacer la variable de type TABLE dans la requête que je vous ai donné par le nom véritable de la table que vous utilisez.

    En aucun cas vous ne devez utiliser ce genre de table dans du code de production, comme je l'ai écrit ici, sauf si vous n'avez aucune autre solution.
    Dans ce dernier cas, cela montre généralement une mauvaise conception du modèle de données.

    j'ai pas trouvé comment je l'enregistre et comment je l'appelle pour incrémenter NumP de la table PieceComptable!
    Ce script est one-shot, il mettra à jour la valeur de compteur pour toute la table.
    Mais je pense que dans votre cas, vous devriez faire ce calcul après chaque insertion dans la table, en appelant une procédure comme celle-ci :

    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
    CREATE PROCEDURE maProcedure
    	@_mois varchar(10)
    	, @_RibRip char(6)
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF NOT EXISTS
    	(
    		SELECT	*
    		FROM	dbo.maTable
    		WHERE	mois = @_mois
    		AND	RibRip = @_RibRip
    	)
    	BEGIN
    		RAISERROR('Il n''existe pas de RibRip %s pour le mois %s', 16, 1, @_RibRip, @_mois)
    		RETURN
    	END
     
    	;WITH
    		CTE AS
    		(
    			SELECT	NumP
    				, mois
    				, RibRip
    				, ROW_NUMBER() OVER(PARTITION BY mois, RibRip ORDER BY NumP) AS NumPC
    			FROM	dbo.maTable
    			WHERE	RibRip = @_RibRip
    			AND	mois = @_mois
    		)
    	UPDATE		dbo.maTable
    	SET		NumPC = C.NumPC
    	FROM		dbo.maTable AS T
    	INNER JOIN	CTE AS C ON T.NumP = C.NumP
    END
    Peut-être que vous pouvez même passer en paramètre le NumP pour ne mettre à jour qu'une seule ligne

    Ensuite il vous faut appeler cette procédure dans votre code, et là tout dépend du langage que vous utilisez pour implémenter votre application.

    @++

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Par défaut
    j'ai pas trouvé le dossier "tables temporaires"
    Images attachées Images attachées  

  8. #8
    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 : 43
    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
    C'est un nœud qui existe seulement pour la base de données TempDB, qui est une base de données système

    @++

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Par défaut remerciement
    Merci Bien

Discussions similaires

  1. Incrémentation automatique d'une colonne chaque jour
    Par krolis dans le forum Débuter
    Réponses: 0
    Dernier message: 21/04/2011, 16h48
  2. remplissage automatique d'une colonne
    Par zanou666 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/12/2007, 15h32
  3. Réponses: 4
    Dernier message: 06/05/2007, 12h57
  4. [VBA-E] Incrémentation automatique d'une valeur suite à l'insertion de ligne
    Par abdelghani_k dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/01/2007, 14h26
  5. [VBA-E 97]Ajout automatique d'une colonne selon la date
    Par paflolo dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/03/2006, 09h35

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