Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2619 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL server 2005] erreur clef trop grande !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL server 2005] erreur clef trop grande !

n°1574857
thekingsky
Posté le 14-06-2007 à 12:58:52  profilanswer
 

:hello:  
 
J'ai un problème:
 
J'ai un table sur mon SQLs erver 2005 qui a en tout 4679 enregistrement.
La clé primaire est bien défini en tant que IDENTITY commencant a 1 par incrément de 1.
Le problème est que c'est une base que j'ai récupéré d'une autre personne et je sais pas comment il c'est démerdé mais l'ID est à -2147483648 d'un coté et à 2147483647 de l'autre. Autrement dit il a atteind les 2 bornes d'un int sur 32 bits !!
 
HORS : au centre il y a des méga trou (forcement 4679 n'est pas égale a 2^32 ;))
 
Donc voilà mon gros problème c'est qu'il veut plus me rajouter des enregistrements car il "crois" qu'il est a la fin il me dit : Une erreur arithmétique s'est produite lors de la conversion de IDENTITY en type de données int. Débordement aithmétique."
J'ai essayé de le passer en big int ca marche niveau SQL server mais le problème c'est que j'intérroge la base avec Access et access ne supporte pas le big int et ne le comprend pas, il me met ca en texte du coup mes formulaires plante !
 
Helpeee   :(   je peu faire comment pour rearranger cette clef sans tout casser ?  :cry:

mood
Publicité
Posté le 14-06-2007 à 12:58:52  profilanswer
 

n°1574868
the prison​er
Posté le 14-06-2007 à 13:09:34  profilanswer
 

tu as des tables liees ?


Message édité par the prisoner le 14-06-2007 à 13:11:22
n°1574875
bignose
Posté le 14-06-2007 à 13:20:48  profilanswer
 

Crée une nouvelle table et copie les colonnes non-identity dedans.  Il regénérera une colonne id correcte.  Puis tu droppes la mauvaise table et tu renommes la nouvelle avec le bon nom.
 
Je pense que ça devrait marcher.

n°1574878
thekingsky
Posté le 14-06-2007 à 13:23:26  profilanswer
 

Oui j'ai beaucoup de table lié à celle-si et surtout elle sont lié sur ce champ !
 
Je peu pas faire comme tu dit bignose je pense qu'il va me perdre tout les liens entre les données(des autres tables liées) et ID si je fais comme tu dit ...
 
:(

n°1574882
thekingsky
Posté le 14-06-2007 à 13:31:32  profilanswer
 

Je viens de rééssayer avec l'ancien base access, le champ ID et donc bien en mode Numéroauto et ca marche .
Access est assez intélligent pour trouver une valeur de clé primaire non continue au milieu de l'int alors que SQL server plante !!! Ca craint!

n°1574884
bignose
Posté le 14-06-2007 à 13:35:53  profilanswer
 

Si tes tables sont liées uniquement via les valeurs des ids et pas via des foreign keys ou des contraintes,  tu peux utiliser une table intermédiaire qui reprend l'ancienne valeur de l'id et la nouvelle et faire un update des autres tables à partir d'elle.
Conseil,  mais probablement inutile,  fais un backup de ta db avant ce genre de manipulation...

n°1574886
bignose
Posté le 14-06-2007 à 13:38:26  profilanswer
 

Access et SQL Server c'est pas le mème usage ni les mèmes capacités ou performances.  Bref c'est pas comparable.  Access fera jamais mieux que SQL server.

n°1574887
thekingsky
Posté le 14-06-2007 à 13:39:11  profilanswer
 

Si, les autres tables sont liée via une foreign key à ce champ merdique :(

n°1574888
bignose
Posté le 14-06-2007 à 13:40:37  profilanswer
 

Rhaaaaa!!!!
Pas de chance.
Tu peux pas scripter la création des contraintes,  les dropper puis corriger tes tables et recréer les contraintes avec les scripts après ?

n°1574890
thekingsky
Posté le 14-06-2007 à 13:44:37  profilanswer
 

oula, là j'ai po capté :)
 
Scripter la créatin des contraintes ca veut dire quoi ?? je suis sur Win serv  2003.
dropper et corriger quel table ??
et recréer quel contrainte ?
lol je suis à l'ouest là :D
 
Mais sinon ya pas moyen que SQL server 2005 réfléchissent un peu pour trouver des ID pas séquentiel ?

mood
Publicité
Posté le 14-06-2007 à 13:44:37  profilanswer
 

n°1574901
thekingsky
Posté le 14-06-2007 à 14:03:25  profilanswer
 

J'ai essayé en créant une table avec les même champs et en copiant juste les données et pas la clé primaire ca corrompt bien toutes les données comme pévu :(
 
Help help help je sais vraiment pas comment faire

n°1574951
thekingsky
Posté le 14-06-2007 à 15:19:03  profilanswer
 

TILT voici peut etre une solution si vous pouviez me dire ce que vous en pensez avant que je fasse tout planter :D :
 
1°) Création d'un nouveau champ ID_nouv de type identity et étant cle primaire (si ca marche pas d'un coup je passerai en créant une autre table et en copiant les données)
2°) Mettre les Foreign Key qui sont sur le champ ID de base vers le nouveau champ ID_nouv
3°) Virer le champ Id de base
4°) Rennomer le nouveau champ ID_nouv en ID de base  
 
Ca peut marcher cette combine ?

n°1574962
bignose
Posté le 14-06-2007 à 15:28:29  profilanswer
 

Dropper et corriger la table dont les IDs sont faux.  Celle qui te pose problème.
 
Tu m'as dit qu'il y avait des contraintes d'intégrité.  Et des foreign keys définies sur les tables.  Tu dois les voir dans studio management.
 
Dans studio management,  tu peux faire un clic droit sur la table et choisir script table as "Create ...".  Dans ce script tu dois juste conserver la création des constrains,  pas la création de la table qui existe déja.  Une fois que t'as les scripts pour toutes les tables, tu peux deleter les contraintes.  Plus tard tu pourras les recréer avec ces scripts.
 
Maintenant ya peut ètre plus simple.  Je sais pas.  C'est une piste à explorer.
 
SQL Server fait ce qu'on lui dit.  Une colonne de type Identity est ce qu'elle est.  Si tu veux pouvoir assigner n'importe quelle valeur faut mettre du int ou du bigint.  Ya pas de secret.  Si Access fait des chippotages,  c'est son problème.  C'est pas pour rien qu'on l'utilise pas ou peu dans des environnements de prod.  Et ceux qui le font c'est à leurs risques et périls.

n°1574973
thekingsky
Posté le 14-06-2007 à 15:34:09  profilanswer
 

ouai mais access en attendant il est intelligent, son autoincrément trouve des numéros au milieu. Alors que SQL server essaye de rajouter juste a la fin et cherche pas plus loin si la table est completement pleine ...
 
Le scipt à lancer je dois le faire sur toute les tables ou ce champ est en foreign key ? je vois pas trop ce que ca va faire et a quoi ca va servir. Si je delete les contraintes ca changera pas mon problème non . Si aprés je delete le champ ID et que je le remplace par un autre que j'aurai créé ca va merder pareil non ?
 
Le script de contrainte crée ces contraintes pour chaque enregistrement de chaque table vers chaque enregistrement de la table ou il y a l'ID qui merde ?
 
merci :)

n°1574984
thekingsky
Posté le 14-06-2007 à 15:40:58  profilanswer
 

En fait il me faudrai un utilitaire qui me change dans toute les tables ou il y a des Foreign key, l'ID courant (celui où il y a plein de trou) par un nouvelle ID que j'aurai créé a coté et qui sera lui continue a partir de 0.

 

Mais SQL server peut le faire ca ? quand je vais changer la Foreign key il va me demander de mettre a jour les champs où il va change la clé sans modifier les données ce qui me cassera toute mon intégrité de mes données ?


Message édité par thekingsky le 14-06-2007 à 15:41:43
n°1574985
bignose
Posté le 14-06-2007 à 15:42:57  profilanswer
 

L'idée c'est:
-  crée les scripts pour les contraintes.  Tu peux tout regrouper dans un seul script,  c'est du copy/paste.
-  crée une nouvelle table ou tu copies celle qui pose problème.
-  crée une deuxième table qui fait le lien entre les anciens ids et les nouveaux.
-  droppe les contraintes.
-  droppe la table problématique.
-  renomme la table correcte avec le bon nom.
-  corrige les ids des tables via un update avec la table faisant le lien.
-  exécute les scripts (ou le script si t'a tout regroupé dans un seul) pour recréer les contraintes.
 
Encore une fois c'est une piste,  ya peut ètre plus simple.  Une ame charitable donnera peut ètre une autre idée.
 
Pour ce qui est de ton idée à mon avis tu vas avoir des problèmes avec les contraintes...  Et c'est du manuel.  Mais ça coute rien d'essayer tant que t'as un backup de ta db.

n°1574994
thekingsky
Posté le 14-06-2007 à 15:53:14  profilanswer
 

Ok c'était un peu dans mon idée :)
 
Les scipts créé en fait ils disent juste, liéer le champ X de la table toto au champ ID de la table qui merde. C'est bien ca ?
 
La table correct c'est celle qui aura les nouveau bon ID à la place des merdiques ?
 
La requete update pour corriger les ID des tables je vois pas trop comment la faire ... désolé.
 
Il faut le faire récursivement pour tout les enregistrements en plus ?
 
tu aurai un exemple stp  
Genre pour la table toto(celle où il y a la FK qui point sur la table merdique), avec la table lien qui s'appelle lien_FK et la bonne table corrigé table_OK.
 
merci de ton aide ;)

n°1575004
thekingsky
Posté le 14-06-2007 à 16:10:13  profilanswer
 

Si je fais une requete SQL comme ca :
 
UPDATE toto
SET SOC_ID = ( SELECT nouv_SOC_ID FROM lien_FK)
WHERE lien_FK.Ancien_SOC_ID = toto.SOC_ID
 
Ca marche ?

n°1575007
thekingsky
Posté le 14-06-2007 à 16:13:27  profilanswer
 

ou plutot ca :

 

UPDATE toto
SET SOC_ID = ( SELECT nouv_SOC_ID
FROM lien_FK WHERE lien_FK.Ancien_SOC_ID = toto.SOC_ID)
WHERE lien_FK.Ancien_SOC_ID = toto.SOC_ID

 

???

 

Faut-il que je lie les tables toto et lien_FK ?


Message édité par thekingsky le 14-06-2007 à 16:16:27
n°1575071
MagicBuzz
Posté le 14-06-2007 à 17:33:06  profilanswer
 

"identity", c'est pas un type... c'est juste un flag.
 
par contre, "integer", C'EST UN TYPE DE MERDE QUI N'EST PAS FAIT POUR FAIRE DES CLES PRIMAIRES BORDEL DE MERDE CA FAIT 4 ANS QUE JE ME FAIT CHIER A PRECHER DANS LE DESERT CA DEVIENT GONFLANT !
 
Change ton champ ID en NUMERIC bordel :fou:

Message cité 1 fois
Message édité par MagicBuzz le 14-06-2007 à 17:33:31
n°1575074
thekingsky
Posté le 14-06-2007 à 17:34:58  profilanswer
 

Et un numeric il va de 0 a 2^32 ?
Si j'ai des clé négative déjà existante ca va donner quoi ?
 
(la base n'a pas été créé par moi mais par un autre petit stagiaire qui a oublié plein de clé primaire aussi :))

n°1575077
MagicBuzz
Posté le 14-06-2007 à 17:36:30  profilanswer
 

Non, un numéric ça a 40 chiffres de précision, quelque soit le nombre de décimales. Et 40 chiffres de précision, c'est >>> 2^32
 
PS : Y'a pas autant d'atomes qui forment la Lune.


Message édité par MagicBuzz le 14-06-2007 à 17:38:41
n°1575192
thekingsky
Posté le 14-06-2007 à 22:03:40  profilanswer
 

Oki,
Et access prendra en compte ce type numeric ?
Je ne pense pas et SURTOUT le type numerique access ne va pas jusqua plus de 2^32 et c'est ce qu'il me faut si tu as bien lu mon poste.

 

Je pense pas que le type numérique fasse du 2^40 ... ni sous SQL server et encore moin sous Access. Mais bon peut etre que je me trompe et ca serai cool pour moi :)

 

Quelqu'un peut me dire si mes requete SQL que j'ai écrite plus haut sont bonne svp, enfin si l'une des 2 l'est :)


Message édité par thekingsky le 15-06-2007 à 08:27:09
n°1575315
the prison​er
Posté le 15-06-2007 à 09:52:02  profilanswer
 

MagicBuzz a écrit :

"identity", c'est pas un type... c'est juste un flag.
 
par contre, "integer", C'EST UN TYPE DE MERDE QUI N'EST PAS FAIT POUR FAIRE DES CLES PRIMAIRES BORDEL DE MERDE CA FAIT 4 ANS QUE JE ME FAIT CHIER A PRECHER DANS LE DESERT CA DEVIENT GONFLANT !
 
Change ton champ ID en NUMERIC bordel :fou:


 
pourquoi on pourraist pas utiliser int pour une clé primaire ?

n°1575325
MagicBuzz
Posté le 15-06-2007 à 10:02:49  profilanswer
 

thekingsky > en effet, après tests, Access ne semble pas être cable de gérer ce type (t'ain mais c'est trop de la merde Access en fait :ouch:)
 
the prosoner > simplement pour une chiée de raisons.
1/ un ID, c'est une information interne, pas une valeur sur laquelle on fait des calculs. on se moque donc de la représentation interne du nombre (à noter que number est une véritable merde à gérer pour faire des calculs)
2/ un ID, c'est indexé. de nouveau, quelque soit le type utilisé, les performances seront les mêmes pour le relire, puisqu'on passera toujours par l'index
3/ ça évite les problèmes "ah ben merde, j'ai plus de 4 millions d'enrestrement dans ma table, ça fait boum, je sais plus quoi faire :cry:"
4/ parceque c'est comme ça :spamafote:
 
A noter que "number" doit aussi être utilisé IMPERATIVEMENT pour tout ce qui est gestion de prix, taxes, etc. Effectivement float a une précision de merde, qui peut provoquer des erreurs d'arrondis, et c'est chiant de remettre en cause un travail de 3 ans de dev pour 2 centimes d'écarts qui empêchent la validation comptable :spamafote:

n°1575334
thekingsky
Posté le 15-06-2007 à 10:10:45  profilanswer
 

Merci magicBuzz mais ca me dit po comment faire :(
La solution de bignose à l'air cool mais je sais pas si mes requete update vont bien faire ce que j'aimerais qu'elle fasse ...

n°1575336
LePhasme
Les Belges domineront le monde
Posté le 15-06-2007 à 10:13:43  profilanswer
 

MagicBuzz a écrit :


A noter que "number" doit aussi être utilisé IMPERATIVEMENT pour tout ce qui est gestion de prix, taxes, etc. Effectivement float a une précision de merde, qui peut provoquer des erreurs d'arrondis, et c'est chiant de remettre en cause un travail de 3 ans de dev pour 2 centimes d'écarts qui empêchent la validation comptable :spamafote:


J'utilise plutot decimal pour les flottant.

n°1575348
MagicBuzz
Posté le 15-06-2007 à 10:27:00  profilanswer
 

DECIMAL est un synonyme de NUMBER ;)
 
Cf. la norme :p

n°1575352
MagicBuzz
Posté le 15-06-2007 à 10:32:06  profilanswer
 

thekingsky a écrit :

Merci magicBuzz mais ca me dit po comment faire :(
La solution de bignose à l'air cool mais je sais pas si mes requete update vont bien faire ce que j'aimerais qu'elle fasse ...


 
Alter tes FK pour que "on  update" ça "cascade".
 
Ensuite, t'as juste à remplacer les valeurs de tes ID foireux en mettant un nombre de 1 à 4000 et quelques.
 
Ca se fait en 30 secondes avec Excel :
 
select id from latablefoireuse;
 
=> copier commer dans la colonne "D" d'une feuille excel.
 
Dans la première ligne de la colonne "A" :
 
"update matablefoireuse set id ="
 
Dans la colonne "B" :
1
 
Dans la colonne "C" :
"where id = "
 
Dans la colonne "E" :
=concatenate(A1,B1,C1,D1)
 
Sur la colonne C, click click sur le petit carré en bas à droite de la la cellule : miracle, ça copie "where id =" sur toutes les lignes jusqu'à la dernière valeur de D
 
Idem sur B : Miracle, ça fait 1, 2, 3, ... tout pareil !
 
Idem A
 
Et enfin E
 
Sélection colonne E ctrl + C
 
CTRL + V dans SQL Query Analyzer
 
F5
 
:spamafote:


Message édité par MagicBuzz le 15-06-2007 à 10:33:02
n°1575371
thekingsky
Posté le 15-06-2007 à 10:52:05  profilanswer
 

Dans le géstionnaire de sql server dans mes table connécté je double clic sur la FK et ya un champ sur INTERT et UPDATE que je déplie
et là il y a pour UPDATE une liste déroulante avec cascade dedant. Je met ca pour chaque table où il y à cette FK

n°1575377
thekingsky
Posté le 15-06-2007 à 10:55:24  profilanswer
 

Et il faut aussi que l'update ce fasse dans le même sens que le select du départ !
 
edit : => question débile ;)
 
Par contre pour le update en cascade c po pareil :)


Message édité par thekingsky le 15-06-2007 à 11:04:28
n°1575395
thekingsky
Posté le 15-06-2007 à 11:11:46  profilanswer
 

D'ailleur c'est pas plutot la clé primaire de la table qui merde qu'il faut mettre en Update en cascade ?

n°1575398
MagicBuzz
Posté le 15-06-2007 à 11:13:11  profilanswer
 

thekingsky a écrit :

Dans le géstionnaire de sql server dans mes table connécté je double clic sur la FK et ya un champ sur INTERT et UPDATE que je déplie
et là il y a pour UPDATE une liste déroulante avec cascade dedant. Je met ca pour chaque table où il y à cette FK


tu mets ça partout où il y a une FK qui pointe sur ce champ.

n°1575399
MagicBuzz
Posté le 15-06-2007 à 11:14:14  profilanswer
 

c'te bordel, je pige rien à ton truc.
 
je te colle un exemple.

n°1575421
MagicBuzz
Posté le 15-06-2007 à 11:47:07  profilanswer
 

Ton bordel actuel, si j'ai bien compris :
 

Code :
  1. -- Script d'origine
  2. CREATE TABLE merdageexpress
  3. (
  4.  id integer identity(1,1) NOT NULL,
  5.  val varchar(50),
  6.  constraint pk_merdageexpress PRIMARY KEY clustered (id)
  7. )
  8. go
  9.  
  10. CREATE TABLE merdecolleeaucul
  11. (
  12.  id integer identity(1, 1) NOT NULL,
  13.  merde_id integer NOT NULL,
  14.  val varchar(50),
  15.  constraint pk_merdecolleeaucul PRIMARY KEY clustered (id),
  16.  constraint fk_merdageexpress FOREIGN KEY (merde_id) REFERENCES merdageexpress(id)
  17. )
  18. go
  19.  
  20. -- Tes données merdées
  21. --SET IDENTITY_INSERT merdageexpress ON
  22. INSERT INTO merdageexpress (id, val) VALUES (123456, '123456');
  23. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (123456, '1 123456');
  24. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (123456, '2 123456');
  25. INSERT INTO merdageexpress (id, val) VALUES (987654, '987654');
  26. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (987654, '3 987654');
  27. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (987654, '4 987654');
  28. INSERT INTO merdageexpress (id, val) VALUES (192837, '192837');
  29. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (192837, '5 192837');
  30. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (192837, '6 192837');
  31. INSERT INTO merdageexpress (id, val) VALUES (-123456, '-123456');
  32. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (-123456, '7 -123456');
  33. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (-123456, '8 -123456');
  34. INSERT INTO merdageexpress (id, val) VALUES (-987654, '-987654');
  35. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (-987654, '9 -987654');
  36. INSERT INTO merdecolleeaucul (merde_id, val) VALUES (-987654, '10 -987654');
  37. --SET IDENTITY_INSERT merdageexpress OFF
  38. go


 
Ce qui donne :


id          val
----------- --------------------------------------------------
-987654     -987654
-123456     -123456
123456      123456
192837      192837
987654      987654
 
(5 row(s) affected)
 
id          merde_id    val
----------- ----------- --------------------------------------------------
1           123456      1 123456
2           123456      2 123456
3           987654      3 987654
4           987654      4 987654
5           192837      5 192837
6           192837      
 6 192837
7           -123456     7 -123456
8           -123456     8 -123456
9           -987654     9 -987654
10          -987654     10 -987654
 
(10 row(s) affected)


 
Premier truc : vire le "identity" pour le moment, c'est pas updateable donc t'es comme un con.
 
Ensuite, donc, la FK "fk_merdageexpress" doit être modifée pour se mettre à jour en cascade.
 

Code :
  1. ALTER TABLE merdecolleeaucul DROP constraint fk_merdageexpress
  2. go
  3.  
  4. ALTER TABLE merdecolleeaucul WITH CHECK ADD constraint fk_merdageexpress FOREIGN KEY (merde_id) REFERENCES merdageexpress(id) ON UPDATE cascade
  5. go


 
Et maintenant, tu peux modifier tes valeurs d'id :

Code :
  1. UPDATE merdageexpress SET id = 1 WHERE id = -987654
  2. UPDATE merdageexpress SET id = 2 WHERE id = -123456
  3. UPDATE merdageexpress SET id = 3 WHERE id = 123456
  4. UPDATE merdageexpress SET id = 4 WHERE id = 192837
  5. UPDATE merdageexpress SET id = 5 WHERE id = 987654


 
Ce qui donne :


id          val
----------- --------------------------------------------------
1           -987654
2           -123456
3           123456
4           192837
5           987654
 
(5 row(s) affected)
 
id          merde_id    val
----------- ----------- --------------------------------------------------
1           3           1 123456
2           3           2 123456
3           5           3 987654
4           5           4 987654
5           4           5 192837
6           4           6 192837
7           2           7 -123456
8           2           8 -123456
9           1           9 -987654
10          1           10 -987654
 
(10 row(s) affected)

n°1575434
the prison​er
Posté le 15-06-2007 à 12:03:54  profilanswer
 

MagicBuzz a écrit :

thekingsky > en effet, après tests, Access ne semble pas être cable de gérer ce type (t'ain mais c'est trop de la merde Access en fait :ouch:)
 
the prosoner > simplement pour une chiée de raisons.
1/ un ID, c'est une information interne, pas une valeur sur laquelle on fait des calculs. on se moque donc de la représentation interne du nombre (à noter que number est une véritable merde à gérer pour faire des calculs)
2/ un ID, c'est indexé. de nouveau, quelque soit le type utilisé, les performances seront les mêmes pour le relire, puisqu'on passera toujours par l'index
3/ ça évite les problèmes "ah ben merde, j'ai plus de 4 millions d'enrestrement dans ma table, ça fait boum, je sais plus quoi faire :cry:"
4/ parceque c'est comme ça :spamafote:
 
A noter que "number" doit aussi être utilisé IMPERATIVEMENT pour tout ce qui est gestion de prix, taxes, etc. Effectivement float a une précision de merde, qui peut provoquer des erreurs d'arrondis, et c'est chiant de remettre en cause un travail de 3 ans de dev pour 2 centimes d'écarts qui empêchent la validation comptable :spamafote:


 
 
ouais donc finalement, seulement utile lorsqu'on prevoit des millions de records.

n°1575448
MagicBuzz
Posté le 15-06-2007 à 12:23:41  profilanswer
 

the prisoner a écrit :

ouais donc finalement, seulement utile lorsqu'on prevoit des millions de records.


non, tu prévoies rien du tout.
 
aujourd'hui ton analyse dit que tu vas avoir 3 lignes dans une table. rien ne te dis que demain ça fera pas plus.
 
number pour toutes les clés, point barre (sauf les clés "expressives" qui correspondent à une donnée, là on préfèreras un varchar ou à la limite un int si c'est vraiment un int la donnée)
 
a noter que sous sql server, microsoft préconise le "uniqueidentifier" comme clé...
 
et un GUID, c'est une série de chiffres hexadécimaux comme on en trouve plein dans la BDR, donc la valeur est imbittable et aléatoire, ceci afin d'encourager les gens à ne pas utiliser l'id comme information.
 
donc pas de int, surtout pas.

n°1576074
thekingsky
Posté le 18-06-2007 à 09:10:16  profilanswer
 

Finalement je vais utiliser la méthode de bignose, car celle avec la mise a jour en cascade des tables liées n'est pas possible. (trop compliqué à expliquer)
 

Citation :


L'idée c'est:  
-  crée les scripts pour les contraintes.  Tu peux tout regrouper dans un seul script,  c'est du copy/paste.  
-  crée une nouvelle table ou tu copies celle qui pose problème.  
-  crée une deuxième table qui fait le lien entre les anciens ids et les nouveaux.  
-  droppe les contraintes.  
-  droppe la table problématique.  
-  renomme la table correcte avec le bon nom.  
-  corrige les ids des tables via un update avec la table faisant le lien.  
-  exécute les scripts (ou le script si t'a tout regroupé dans un seul) pour recréer les contraintes.  


 
 
Par contre j'ai un pb pour la requetes update :
Je pense que l'une des deux est juste mais je sais pas laquel ...:
 
UPDATE toto
SET SOC_ID = ( SELECT nouv_SOC_ID  
FROM lien_FK WHERE lien_FK.Ancien_SOC_ID = toto.SOC_ID)
WHERE lien_FK.Ancien_SOC_ID = toto.SOC_ID  
 
 
UPDATE toto  
SET SOC_ID = ( SELECT nouv_SOC_ID FROM lien_FK)  
WHERE lien_FK.Ancien_SOC_ID = toto.SOC_ID  
   
 :sweat:  
 

n°1576229
thekingsky
Posté le 18-06-2007 à 13:21:24  profilanswer
 

Bon et bien voilà c'est fait, je me suis lancé.
 
Voici ma requete de mise à jout :
 
UPDATE "modif histo"
SET SOC_ID = ( SELECT SOCIETE_CORRESPONDANCE.NOUV_SOC_ID  
FROM SOCIETE_CORRESPONDANCE toto INNER JOIN SOCIETE_CORRESPONDANCE
ON "modif histo".SOC_ID = SOCIETE_CORRESPONDANCE.ANC_SOC_ID
WHERE toto.ANC_SOC_ID = "modif histo".SOC_ID)  
 
Ca à l'air d'avoir marché je retrouve bien mes données où il faut et comme il faut :)
 
Ouuuffffffffffffffff  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:


Message édité par thekingsky le 18-06-2007 à 13:24:51
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL server 2005] erreur clef trop grande !

 

Sujets relatifs
Question bête : Projet Win32 sous VC++ 2005 Express[SQL Server 2005] Accès au donnée par requete SQL en VB
Problème D'insertion dans SQL[ACCESS] requete SQL max date
[FLASH] why ? (message d'erreur)Quid de la gestion d'erreur PHP5
Petite erreur de rien du tout , header('locationA l'aide ! erreur totalemnt incompréhensible en svg
Plus de sujets relatifs à : [SQL server 2005] erreur clef trop grande !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR