Meilleur auteur de réponses
une requète qui butte sur le mot "the"

Question
-
bonjour
J'ai un problème à l'exécution dans une requète: elle apparait après que le mot the ait été mesuré comme différent du mot The dans un insert qui est case non sensitive: le conflit est encore un conflit entre The et the
INSERT INTO T_WORD ( nuIDWord, vcString, siOccurrence, siIdPOS, siIdLang, nuIdLemma) VALUES ( @ID, @Text, @Ocurr, @POS, @Lang, @Lemma);
"Impossible d'insérer une ligne de clé en double dans l'objet « dbo.T_WORD » avec un index unique « T_WORD_uniqueness_IDX ». La valeur de clé dupliquée est ('the', 2, 2). L'instruction a été arrêtée."
c'est dans la table T_WORD qui est décrite ci-dessous
CREATE TABLE T_WORD ( nuIdWord NUMERIC(18,0) NOT NULL identity, vcString VARCHAR(128) NOT NULL, siIdPOS SMALLINT NOT NULL, siOccurrence SMALLINT constraint T_WORDsiOccurrence_Chk CHECK ( (siOccurrence >= 1) OR (siOccurrence IS NULL) ) , siIdLang SMALLINT NOT NULL, nuIdLemma NUMERIC(18,0) NOT NULL, constraint T_WORD_PK PRIMARY KEY (nuIdWord)); /* Ajouter les clés, les contraintes et les index restant pour la table T_WORD. */ create unique index T_WORD_uniqueness_IDX on T_WORD ( vcString, siIdPos, siIdLang) alter table T_SEG_WORD add constraint T_WORD_FK1 foreign key ( nuIdWord) references T_WORD ( nuIdWord); /* Ajouter des contraintes de clé étrangère à la table T_WORD. */ alter table T_WORD add constraint T_LANGUAGE_FK6 foreign key ( siIdLang) references T_LANGUAGE ( siIdLang);
Doit on modifier la requête ou le script de création, et comment?
Jean Noël Martin
- Modifié JeanNoel53 jeudi 4 septembre 2014 07:09
Réponses
-
Bonjour,
Bonne nouvelle, la solution est dans l'énoncé de votre problème :-)
En effet, regarder la définition de votre index :
create unique index T_WORD_uniqueness_IDX on T_WORD ( vcString, siIdPos, siIdLang)
Vous interdisez d'avoir vcString, siIdPos, siIdLang identique. Par ailleurs vous indiquez être en case non sensitive.
En clair, que vous insériez ('The', 2,2) ou bien encore ('the',2,2) ou bien encore ('THE', 2, 2,) ('thE', 2, 2,), etc. Vous insérez la même chose !
Ne vous inquiétez en revanche pas, ceci nous arrive à tous même au niveau pro ; le case insensitive est généralement avantageux... Sauf quand on n'en veut plus :-D
Voici ce que vous devriez essayer au niveau SQL :
drop index T_WORD.T_WORD_uniqueness_IDX ALTER TABLE T_WORD ALTER COLUMN vcString VARCHAR(128)COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL /* Ajouter les clés, les contraintes et les index restant pour la table T_WORD. */ create unique index T_WORD_uniqueness_IDX on T_WORD ( vcString, siIdPos, siIdLang)
On supprime l'index car sinon on ne peut plus modifier la colonne.
On modifie la colonne en changeant la COLLATION. J'ai indiqué celle classique que vous devez probablement utilisé.
Puis on remet l'index... Ca devrait normalement fonctionner car la colonne est cette fois gérée différemment... Attention toutefois, vous pouvez désormais avoir des effets de bord car :
select * from t_word where vcString ='The'
N'est plus équivalent à
select * from t_word where vcString ='the'
Bien cordialement,
Fabrice JEAN-FRANCOIS, Novencia TS
- Marqué comme réponse JeanNoel53 vendredi 5 septembre 2014 07:09
Toutes les réponses
-
-
-
Bonjour,
Bonne nouvelle, la solution est dans l'énoncé de votre problème :-)
En effet, regarder la définition de votre index :
create unique index T_WORD_uniqueness_IDX on T_WORD ( vcString, siIdPos, siIdLang)
Vous interdisez d'avoir vcString, siIdPos, siIdLang identique. Par ailleurs vous indiquez être en case non sensitive.
En clair, que vous insériez ('The', 2,2) ou bien encore ('the',2,2) ou bien encore ('THE', 2, 2,) ('thE', 2, 2,), etc. Vous insérez la même chose !
Ne vous inquiétez en revanche pas, ceci nous arrive à tous même au niveau pro ; le case insensitive est généralement avantageux... Sauf quand on n'en veut plus :-D
Voici ce que vous devriez essayer au niveau SQL :
drop index T_WORD.T_WORD_uniqueness_IDX ALTER TABLE T_WORD ALTER COLUMN vcString VARCHAR(128)COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL /* Ajouter les clés, les contraintes et les index restant pour la table T_WORD. */ create unique index T_WORD_uniqueness_IDX on T_WORD ( vcString, siIdPos, siIdLang)
On supprime l'index car sinon on ne peut plus modifier la colonne.
On modifie la colonne en changeant la COLLATION. J'ai indiqué celle classique que vous devez probablement utilisé.
Puis on remet l'index... Ca devrait normalement fonctionner car la colonne est cette fois gérée différemment... Attention toutefois, vous pouvez désormais avoir des effets de bord car :
select * from t_word where vcString ='The'
N'est plus équivalent à
select * from t_word where vcString ='the'
Bien cordialement,
Fabrice JEAN-FRANCOIS, Novencia TS
- Marqué comme réponse JeanNoel53 vendredi 5 septembre 2014 07:09