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 :

Insert massif et identity


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut Insert massif et identity
    Bonjour

    J'aimerai faire la requête suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T1 (id, champ1)
    SELECT MAX(T1.id)+1, T2.champ1
    FROM T2

    Je ne sais pas si ma requête est bien claire?

    Il y aurai-t-il une solution?

    Merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Je pense que tu devrais passer par un curseur ou faire ceci par code.

    A+

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par défaut
    Ceci est la pire des bêtises...
    1) il existe un auto incrément dans SQL Server (propriété IDENTITY)
    Lisez ce que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p6...ec-sql-server/
    2) il existe aussi une fonction IDENTTY() pour faire un SELECT ... INTO
    3) le SELECT MAX() + 1 ne vous donnera qu'une seule valeur en non n valeurs pour chaque ligne. SQL Est un langage ensembliste et non, ligne à ligne
    4) dans le pire des cas, utilisez la fonction ROW_NUMBER() disponible à partir de la V 2005.

    A lire sur l'auto incrémentation : http://sqlpro.developpez.com/cours/clefs/

    En complément, incrémentation massive de plusieurs lignes :
    http://blog.developpez.com/sqlpro/p6...nes-a-increma/

    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/ * * * * *

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    3) le SELECT MAX() + 1 ne vous donnera qu'une seule valeur en non n valeurs pour chaque ligne. SQL Est un langage ensembliste et non, ligne à ligne
    Oui je sais... c'est bien pour cela que je demande, je sais bien que la requête que j'ai ecrit est :
    1 - Complètement fausse
    2 - irréalisable avec un MAX

    Citation Envoyé par SQLpro Voir le message
    4) dans le pire des cas, utilisez la fonction ROW_NUMBER() disponible à partir de la V 2005.
    J'ai essayé... perf catastrohpique... j'essaye de traiter en une requête plusieurs milliers d'enregistrements

    Je pense que votre article sur IDENTITY est la bonne réponse à mon problème... mais je n'ai pas réussi à trouver une doc correcte à ce sujet sur MSDN.

    Je pense que votre article va bien m'aider

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut
    En fait je retire ce que j'ai dit... je croyais que l'on pouvait spécifier une colonne en IDENTITY temporairement, mais d'après votre article on peut juste désactiver la propriété IDENTITY sur une table... donc IDENTITY ne peut pas résoudre mon problème

    Mais il n'y a pas trop de difficulté à faire cela... ce que j'essaye de faire et bien.. c'est tout le contraire!

    Bien entendu je ne peux pas passer ma colonne on IDENTITY (par exemple parceque différents sites WEB gère cet ID en session... mauvais choix technique, mais bon, j'ai pas le choix il faut que je fasse avec)

    Est-ce possible de spécifier une colonne de type int en IDENTITY après la définition de la table?



    PS: autant je suis plutôt un pro SqlServer, autant je regrette ce bon vieux ROWNUM ORACLE qui m'aurait éviter bien des soucis!

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par défaut
    Est-ce possible de spécifier une colonne de type int en IDENTITY après la définition de la table?
    Le seule moyen est de supprimer et recréer la colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    autant je regrette ce bon vieux ROWNUM ORACLE qui m'aurait éviter bien des soucis!
    mais il en pose d'autres...

    Quel est votre problème au niveau fonctionnel ?

    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/ * * * * *

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut
    Le soucis qui m'empêche de remplacer ma colonne?

    Et bien il s'agit d'une table de produit qui peut être appelée par de nombreux points (logiciels, sites webs...etc) et je n'est pas franchement envie de tous checker

    En plus ça impacte plusieurs équipes de développements... bref ce serait un peu compliqué...

    Il n'y a vraiment aucun moyen?

    Pour l'instant je suis partie sur une table contenant des ID uniquements, puis je compare par rapport aux ID qui n'existent pas dans ma table produit (Avec un SELECT ... WHERE NOT EXISTS() ) et ensuite je fais un FETCH pour l'insertion...

    MAIS QUELLE HORREUR POUR FAIRE UN SIMPLE ROWNUM!!!!

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Je n'ai pas compris ton problème. Si tu as une table T1 contenant un champ id autoincrémenté, et Champ1.
    Qu'est ce qui t'empêche d'écrire cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T1 ( champ1)
    SELECT  T2.champ1
    FROM T2
    Si id est auto incrémenté il s'alimentera tout seul.
    A+
    Soazig

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut
    Relisez bien tout...

    IL N'Y A PAS DE CLE IDENTITY ET JE NE PEUX PAS EN METTRE!

    c'est bien là tout le coeur du problème

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par défaut
    tu peut toujours rajouter une telle colonne en surnombre dans ta table. L'effet final sera le même...

    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/ * * * * *

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Désolée je n'avais pas compris.
    Une nouvelle suggestion tu crée une table intermédiaire table_tampon avec un id auto incrémenté et tu insères tes valeurs de dans et après tu réinsère à partir de cette table dans ta table T1
    Tu récupére la valeur max de ton id actuel tu rajoute un coefficient de sécurité et tu obtiens une valeur de départ de ton id, mettons 10 000
    Et tu modifies le 1er n° auto incrémenté avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBCC CHECKIDENT ('TABLE_TAMPON', RESEED, 10000)
    Après tu insères dans ta table tampon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO TABLE_TAMPON ( champ1)
    SELECT  T2.champ1
    FROM T2
    Puis tu insères dans T1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T1 (id, champ1)
    SELECT id_new, champ1
    FROM TaBLE_TAMPON
    Puis tu droppes Table_tampon qui ne sert plus à rien.
    C'est un peu bestial mais ça pourrais marcher.

    [Edit]
    Avec la meme idée mais sans changer le N° de départ de id_new dans TABLE_TAMPON
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T1 (id, champ1)
    SELECT id_new +10000, champ1
    FROM TaBLE_TAMPON
    On est d'accord qu'à la place de 10000 tu mets un nombre qui convient
    [/edit]
    A+
    Soazig

  12. #12
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Par défaut anwar
    salut !!!! j'ai un problème est ça dure depuis le debut de cette année a ce qui concerne identity de sql server 2000 , ce que j'aimerai savoir est ce qu'il y'a une solution ou un autre mot clé claire et net pour une auto-incrémentation saine et sauf ?? ce que je voulais dire par cela c'est que quand j'utilise identity dans mes table et et quand je supprime mes enregistrement le compteur de identity continue a s'auto-incrementé sauf quand je supprime ma base de donnée !!!
    y'a t'il une solution pour cela , et mèrci !!!!!

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par défaut
    par essence et nature toute clef consommée est définitivement perdu. Sinon, vous allez au devant de catastrophe. pensez par exemple aux problématiques de récupération de données en cas de sauvegarde...
    Lisez l'article, déjà cité, que j'ai écrit à ce sujet.

    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/ * * * * *

  14. #14
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Par défaut anwar
    mèrci pour votre réponse , mais quoi faire donc ?!!! je suis un débutant en sql server 2000 , et je sais pas comment gérer ce problème ??!!! et je trouve que c'est un peu difficile pour moi votre article a ce qui concèrne les code qui s'y trouve
    y'a poa un bout de code qui pourra m'ètre utile a ma situation s'il vout plait !!!
    mèrci !!!

  15. #15
    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 vous l'a dit SQLPro :

    toute clef consommée est définitivement perdu. Sinon, vous allez au devant de catastrophe
    Je complète sa réponse : la plupart du temps cette propriété d'auto-incrémentation sert de clé primaire à une table, donc elle est importante pour l'intégrité référentielle (contraintes de clé étrangère) de la base de données.

    En quoi cela vous gêne-t-il que la colonne s'auto-incrémente ? Si c'est parce que les valeurs de la colonne concernée ne se suivent pas après une suppression ou une transaction avortée, vous perdez du temps ...

    Au pire vous pouvez utiliser la commande DBCC CHECKIDENT, mais vous allez tout pourrir, les performances comme le reste ...

    Exposez nous plutôt ce que vous cherchez à faire, peut-être que nous trouverons une solution adéquate

    @++

  16. #16
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Par défaut anwar
    Mèrci lesuk pour votre reponse !!!!
    voila en gros j'ai un directeur un peu très exigeant , la chui entain de travailler sur gestion commercial , et j'ai un peu mal a digérer que identity n'initialise pas son compteur a zero ou bien de -1 !!!!
    bref !!!
    j'ai une table user que je crée pour la relier a un gridview pour un ajout via des texbox !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create table users(
    idper int identity(1,1) NOT NULL PRIMARY KEY, 
    nom varchar (20) NOT NULL,
    prenom varchar (20) NOT NULL,
    login varchar (20) NOT NULL,
    motpasse varchar (20) NOT NULL,
    )
    et puisque identity ne se réinitialise pas après chaque suppression , il va surement me pourrir la vie !!!!
    alor s'il y'a un moyen son dégât pour pour rendre cela facile et bien utiliser et sans perdre mes donnée comme vous me l'avez di avant j'en serai très reconnaissant !!!
    et mèrci encore

  17. #17
    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,

    identity n'initialise pas son compteur a zero ou bien de -1 !!!!
    C'est à vous de décider de quelle valeur doit démarrer le compteur.
    Vous pouvez aussi décider du pas d'incrémentation du compteur.

    Ainsi si dans la définition de votre table vous écrivez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE users
    (
    	idper int identity(15,3) NOT NULL PRIMARY KEY, 
    	nom varchar (20) NOT NULL,
    	prenom varchar (20) NOT NULL,
    	login varchar (20) NOT NULL,
    	motpasse varchar (20) NOT NULL,
    )
    Le compteur sur la colonne idper commencera à 15 et s'incrémentera à chaque fois de 3 (15, 18, 21, ...)

    puisque identity ne se réinitialise pas après chaque suppression , il va surement me pourrir la vie !!!!
    Je ne vois pas pourquoi : cela n'empêche pas les utilisateurs d'avoir un identifiant unique

    s'il y'a un moyen son dégât pour pour rendre cela facile et bien utiliser et sans perdre mes donnée
    Laissez faire SQL Server, il se débrouille très bien tout seul pour peu que vous l'ayez bien guidé

    @++

  18. #18
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Par défaut mèrci CTEMan pour votre Réponse
    mais ce que je voudrai savoir , est ce qu'il y'a carément pas une solution pour une réorganisation automatique d'identity ???!!!
    ou bien une autre solution c'est toujours bien , !!!?
    mèrci !!

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut
    C'est très simple : la solution c'est de ne pas gérer cette colonne par un identity...

    Car identity ne vous permets pas de faire cela. Gérez cela avec une colonne int que vous incrémenterez à la main.

  20. #20
    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,

    Gérez cela avec une colonne int que vous incrémenterez à la main.
    "A la main" : je ne suis pas sûr que cela fasse que l'application qui va utiliser la base de données soit fiable ensuite

    Et en faisant un MAX(colonne) + 1, il y aura quand même des "trous", et des performances médiocres.

    Le mieux à mon sens est de laisser la colonne avec le compteur, je n'ai pas vu le problème que cela posait : l'utilisateur se fiche éperdument que les utilisateurs aient des identifiants qui ne se suivent pas, et ce devrait être le cas des développeurs également

    @++

Discussions similaires

  1. [PROC] Optimisation d'insert massif en "Bulk Load"
    Par Jacker0r dans le forum SAS Base
    Réponses: 19
    Dernier message: 24/03/2011, 22h34
  2. SQL 2k5 - Bulk Insert et contrainte identity
    Par Luc1an0 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 08/01/2008, 19h35
  3. Insertion impossible car identity insert défini à off
    Par dubidon dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/06/2007, 15h34
  4. Insert massif
    Par jexl dans le forum Requêtes
    Réponses: 5
    Dernier message: 11/10/2005, 16h15
  5. [FB] Insert massif et lenteur...
    Par Benjamin GAGNEUX dans le forum Débuter
    Réponses: 26
    Dernier message: 02/08/2005, 15h25

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