Suppresion dans sqlite

Bonjour,
je suis contraint de faire des enregistrement, sans vraiment avoir un User_ID unique… c’est parce que je recupere chaque jour des donnes via excel que je stocke dans une BDD…
du coup, je me retrouve avec des infos(nom-prenom) sur lesquelles je dois en continue faire des verifications de similitudes avec mes enregistrements precedents, pour garder ma coherence.
je dois sois supprimer des lignes dans ma BDD soit les “updater”…

Sans cl primaire dans une BDD sqlite, la suppresion me semble impossible ? est-ce une realit ?
du coup je cree un champs en autoincrementation primaire que je n’utilise pas, mais sa prsence permet la suprression dans la BDD…

sauf qu’ a chaque enregistrement, ou modification je cre environ 800 enregistrements… au rythme des modifications (X800 plusieurs fois dans la journe) dans quelques annes (4 ou 5 ans) j’arriverai au max de la valeur de mon champs auto increment… puisque exemple enregitrement 1 = valeur 800 dans mon champs
et pour la modif ( je supprime et re-enregistre tout) donc mes 800 lignes on la valeur autoincremente 1600… etc…
meme si y a de la marge… c’est dommage…
tout ca a cause du champs "obligatoire primary autoincrement " necessaire pour la suppression de ligne… sauf si on peut faire autrement…

merci…

rough translation(google)

[quote]Hello,
I am forced to make recordings without really having a unique User_ID … it is because I retrieve daily data via excel that I store in a database.
So I find myself with info (name-firstname) on which I must continuously make verifications of similarities with my previous recordings, to keep my consistency.
I have to be deleting lines in my database either the “updater” …

Without primary key in a sqlite database, the suppresion seems impossible to me? Is it a reality?
I create a field in primary autoincrementation that I do not use, but its presence allows the suprression in the BDD …

Except for each recording, or modification I create about 800 recordings … to the rhythm of the modifications (X800 several times in the day) in a few years (4 or 5 years) I will arrive at the max of the value of my auto incremented field … since record example 1 = 800 value in my fields
And for the modif (I delete and re-save everything) so my 800 lines have the value autoincremented to 1600 … etc …
Even if there is margin … it is a pity …
All this because of the “obligatory primary autoincremented” field necessary for the deletion of line … except if one can do otherwise …
[/quote]

But even then I’m not sure what the question is :slight_smile:

Julien, lorsque vous postez en français, assurez-vous que vous le faites dans le canal Français. Vous devriez changer de canal. Pour cela, cliquez sur Controls, puis “Change Channel”, et sélectionnez “Français”.

fait, dsl…

Bravo. Dsol de ne pouvoir vous aider avec le pb sqlite, mais premire vue, je ne comprend pas pourquoi vous devriez ajouter 800 enregistrements chaque modification.

J’espre que quelqu’un plus ferr saura dbrouiller cela. Il est dommage que Dave n’ait pas pu aider, c’est un grand spcialiste.

si tu es en mono utilisateur, tu peut enlever le autoincrement
et creer ton prochain id toi meme, en prenant le max des no prsent dans la base +1.
ca n’evitera pas les trous de numros, mais ca en enlevera un paquet quand mme .

[quote=330666:@Michel Bujardet]Bravo. Désolé de ne pouvoir vous aider avec le pb sqlite, mais à première vue, je ne comprend pas pourquoi vous devriez ajouter 800 enregistrements à chaque modification.

J’espère que quelqu’un plus ferré saura débrouiller cela. Il est dommage que Dave n’ait pas pu aider, c’est un grand spécialiste.[/quote]
Plus simple que de faire des update sur des champs que je devrais tester prealablement 1 par 1…
En fait je supprime tous mes elements de la date concernee pour les re-enregistrer…

Il manque des infos pour donner une rponse, mais si tu as des lments “uniques”, tu peux les utiliser pour “localiser” la fiche (Record) supprimer.

Exemple:
Tu as les colonnes: Prnom, Nom, Date et heure ?
Si oui et que la data et heure sont uniques (un seul enregistrement contient cette date et heure), tu peux utiliser cel pour effacer cette fiche.
http://sqlite.com/lang_delete.html

Exemple: DELETE FROM TABLE MaJolieTable WHERE [PRNOM = xyz] [NOM = zyx] [DATE_TIME = 2017-05-11 21:33:10]

Les donnes entre crochet doivent correspondrent tes donnes (Nom de colonne / Contenu de la colonne) et valeurs de lenregistrement effacer.

Par ailleurs, et en fonction du contenu de ta base de donnes, tu peux “dupliquer” ta base dans une autre qui elle aura un Unique ID.

Jespre que cest clair.

[code]It’s easy to find duplicates with one field:

SELECT name, COUNT(email)
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )

So if we have a table

ID NAME EMAIL
1 John asd@asd.com
2 Sam asd@asd.com
3 Tom asd@asd.com
4 Bob bob@asd.com
5 Tom asd@asd.com

This query will give us John, Sam, Tom, Tom because they all have the same email.

However, what I want is to get duplicates with the same email and name.


try this:

declare @YourTable table (id int, name varchar(10), email varchar(50))

INSERT @YourTable VALUES (1,‘John’,‘John-email’)
INSERT @YourTable VALUES (2,‘John’,‘John-email’)
INSERT @YourTable VALUES (3,‘fred’,‘John-email’)
INSERT @YourTable VALUES (4,‘fred’,‘fred-email’)
INSERT @YourTable VALUES (5,‘sam’,‘sam-email’)
INSERT @YourTable VALUES (6,‘sam’,‘sam-email’)

SELECT
name,email, COUNT() AS CountOf
FROM @YourTable
GROUP BY name,email
HAVING COUNT(
)>1

OUTPUT:

name email CountOf


John John-email 2
sam sam-email 2

(2 row(s) affected)


if you want the IDs of the dups use this:

SELECT
y.id,y.name,y.email
FROM @YourTable y
INNER JOIN (SELECT
name,email, COUNT() AS CountOf
FROM @YourTable
GROUP BY name,email
HAVING COUNT(
)>1
) dt ON y.name=dt.name and y.email=dt.email

OUTPUT:

id name email


1 John John-email
2 John John-email
5 sam sam-email
6 sam sam-email

(4 row(s) affected)


to delete the duplicates try:

DELETE d
FROM @YourTable d
INNER JOIN (SELECT
y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY y.name,y.email,y.id) AS RowRank
FROM @YourTable y
INNER JOIN (SELECT
name,email, COUNT() AS CountOf
FROM @YourTable
GROUP BY name,email
HAVING COUNT(
)>1
) dt ON y.name=dt.name and y.email=dt.email
) dt2 ON d.id=dt2.id
WHERE dt2.RowRank!=1
select * FROM @YourTable

OUTPUT:

id name email


1 John John-email
3 fred John-email
4 fred fred-email
5 sam sam-email

(4 row(s) affected)

[/code]

Jean-Yves:
cela m’arrive aussi de placer de l’anglais dans un texte français. :wink: