Bonjour
J'aimerai faire la requête suivante :
Code:
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
Version imprimable
Bonjour
J'aimerai faire la requête suivante :
Code:
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
Je pense que tu devrais passer par un curseur ou faire ceci par code.
A+
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 +
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
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;)
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!
Le seule moyen est de supprimer et recréer la colonne.Citation:
Est-ce possible de spécifier une colonne de type int en IDENTITY après la définition de la table?
mais il en pose d'autres...Code:autant je regrette ce bon vieux ROWNUM ORACLE qui m'aurait éviter bien des soucis!
Quel est votre problème au niveau fonctionnel ?
A +
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 :cry:
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!!!! :aie:
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 celaSi id est auto incrémenté il s'alimentera tout seul.Code:
1
2
3 INSERT INTO T1 ( champ1) SELECT T2.champ1 FROM T2
A+
Soazig
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:(
tu peut toujours rajouter une telle colonne en surnombre dans ta table. L'effet final sera le même...
A +
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 unAprès tu insères dans ta table tamponCode:DBCC CHECKIDENT ('TABLE_TAMPON', RESEED, 10000)
Puis tu insères dans T1Code:
1
2
3 INSERT INTO TABLE_TAMPON ( champ1) SELECT T2.champ1 FROM T2
Puis tu droppes Table_tampon qui ne sert plus à rien.Code:
1
2
3 INSERT INTO T1 (id, champ1) SELECT id_new, champ1 FROM TaBLE_TAMPON
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
On est d'accord qu'à la place de 10000 tu mets un nombre qui convientCode:
1
2
3 INSERT INTO T1 (id, champ1) SELECT id_new +10000, champ1 FROM TaBLE_TAMPON
[/edit]
A+
Soazig
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é :roll: sauf quand je supprime ma base de donnée !!!
y'a t'il une solution pour cela , et mèrci !!!!!
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 +
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 :oops:
y'a poa un bout de code qui pourra m'ètre utile a ma situation s'il vout plait !!!
mèrci !!!
Bonjour,
Comme vous l'a dit SQLPro :
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.Citation:
toute clef consommée est définitivement perdu. Sinon, vous allez au devant de catastrophe
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 ;)
@++ ;)
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 !!!
et puisque identity ne se réinitialise pas après chaque suppression , il va surement me pourrir la vie !!!! :oops:Code:
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, )
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 :)
Bonjour,
C'est à vous de décider de quelle valeur doit démarrer le compteur.Citation:
identity n'initialise pas son compteur a zero ou bien de -1 !!!!
Vous pouvez aussi décider du pas d'incrémentation du compteur.
Ainsi si dans la définition de votre table vous écrivez :
Le compteur sur la colonne idper commencera à 15 et s'incrémentera à chaque fois de 3 (15, 18, 21, ...)Code:
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, )
Je ne vois pas pourquoi : cela n'empêche pas les utilisateurs d'avoir un identifiant unique ;)Citation:
puisque identity ne se réinitialise pas après chaque suppression , il va surement me pourrir la vie !!!!
Laissez faire SQL Server, il se débrouille très bien tout seul pour peu que vous l'ayez bien guidé ;)Citation:
s'il y'a un moyen son dégât pour pour rendre cela facile et bien utiliser et sans perdre mes donnée
@++ ;)
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 !!
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.
Bonjour,
"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 ;)Citation:
Gérez cela avec une colonne int que vous incrémenterez à la main.
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 ;)
@++ ;)