2016-09-20 4 views
0

J'essaie de savoir si mes valeurs insérées sont auto-incrémentées correctement ou si pour une raison quelconque on n'a pas réussi à être inséré, supprimé ou disparu "manquant" . J'ai essayé plusieurs réponses de Stackoverflow mais ils pointaient principalement des valeurs autoincrementable int ils n'ont pas aidé depuis que le mien est une valeur VARCHAR qui suit la séquence suivante:Mysql - Vérifie si la colonne VARCHAR a une valeur manquante sur son incrémentation

AA000001 
AA000002 
... 
AA000100 
... 
AA213978 

et ainsi de suite ...

Merci pour votre temps.

+1

est un motif fixe AAxxxxxx? –

+0

pourrait même être 'etc000001' ... – Drew

+0

ou peut-il être 'AAAxxxxx'? Parce que si seulement 2 vous pouvez utiliser 'substring' ou' left' ou 'right' pour couper le' varchar' – Nebi

Répondre

3

Vous pouvez déclarer Vars SQL dans la requête et calculer la différence de chaque itération, comme le montre l'exemple ci-dessous:

Schéma

create table MyTable 
( ai int auto_increment primary key, 
    id varchar(100) not null 
); 
insert MyTable (id) values 
('AA000001'), 
('AA000002'), 
('AA000005'), 
('AA000008'), 
('AA000009'), 
('AA000010'); 

Recherche

select id 
FROM 
( 
    select 
     t.id, 
     SUBSTRING(t.id,3) as s, 
     CAST(SUBSTRING(t.id,3) AS UNSIGNED) - @lastId as diff, 
     if(@lastId = 0, 0, CAST(SUBSTRING(t.id,3) AS UNSIGNED) - @lastId) as Difference, 
     @lastId := CAST(SUBSTRING(t.id,3) AS UNSIGNED) as dummy 
    from 
     `MyTable` t, 
     (select @lastId := 0) SQLVars 
    order by 
     t.id 
) d 
WHERE diff>1; 

C'est à l'intérieur requête (pas le jeu de résultats final de ce qui précède)

+----------+--------+------+------------+-------+ 
| id  | s  | diff | Difference | dummy | 
+----------+--------+------+------------+-------+ 
| AA000001 | 000001 | 1 |   0 |  1 | 
| AA000002 | 000002 | 1 |   1 |  2 | 
| AA000005 | 000005 | 3 |   3 |  5 | 
| AA000008 | 000008 | 3 |   3 |  8 | 
| AA000009 | 000009 | 1 |   1 |  9 | 
| AA000010 | 000010 | 1 |   1 | 10 | 
+----------+--------+------+------------+-------+ 

Résultats réels de recherche: Au-dessus

+----------+ 
| id  | 
+----------+ 
| AA000005 | 
| AA000008 | 
+----------+ 

Voici le SQL Fiddle.

+0

table est un mot réservé donc il faut back-ticks – Drew

+0

Fait, merci de le signaler. –

+0

Là, fixé quelques fautes de frappe, pas sûr que ce soit le résultat que vous voulez – Drew

0

Pour tester simplement s'il y a des valeurs manquantes ,

select count(*) <> max(right(col, 6))-min(right(col, 6))+1 || count(*) <> count(distinct col)