[OK]SQLite et DELETE

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[OK]SQLite et DELETE

Message par Ar-S »

J'ai encore un soucis avec SQLITE.

Dans ma table datetest j'ai colonne id et colonne dateR

J'aimerai faire en sorte de pouvoir limiter la suppression de lignes avec les même données X dans une certaine limit.
J'ai vu que SQLite en PB n'aimait pas les condition avec ORDER BY Y ASC LIMIT Z
J'ai donc formaté ma requète ainsi.

Code : Tout sélectionner

Procedure DeleteRow(Base, Ladate$, l$="1")
    Protected R
    R = MessageRequester("Confirmation","Souhaitez vous réellement supprimer la date "+Ladate$+ " ?",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)
    Select R
        Case #PB_MessageRequester_Yes
             If OpenDatabase(#MaBase, Filename$, "", "")
                ;Requete$ = "DELETE FROM "+TableName$+ " WHERE "+ColDate$ + "='"+Ladate$+"' ORDER BY "+ColDate$+" ASC LIMIT "+l$
                Requete$ = "DELETE FROM "+TableName$+ " WHERE "+ColDate$ + "= (SELECT "+ColDate$+ " FROM "+TableName$+" WHERE "+ColDate$ + "='"+Ladate$+"' ORDER BY "+ColDate$ + " ASC LIMIT "+l$ +")"
                Debug Requete$
                Result = DatabaseUpdate(Base, Requete$)
                If Result = 0
                    erreur$ = DatabaseError()
                    Debug "Erreur delete : " + erreur$
                Else
                    Debug Ladate$ + " a été supprimé !"
                    Result = 1
                EndIf
                FinishDatabaseQuery(#MaBase)
                CloseDatabase(#MaBase)
            EndIf
        Case #PB_MessageRequester_No
            Result = 0
        Default
            Result = 0
    EndSelect
    ProcedureReturn Result
EndProcedure
Ce qui m'affiche comme requete lorsque je fais : DeleteRow(#MaBase,"2022-04-04")

Code : Tout sélectionner

DELETE FROM datetest WHERE dateR= (SELECT dateR FROM datetest WHERE dateR='2022-04-04' ORDER BY dateR ASC LIMIT 1)
Ce qui me parait bien.
Sauf que mon LIMIT 1 passe à la trappe et toutes les lignes contenant "2022-04-04" dans dateR sont virées. Faut peut être passer par un DatabaseQuery() avant ? J'avoue que je suis un peu peaumé

Amis de la BDD si vous passez par là.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: SQLite et DELETE

Message par Marc56 »

Il faut que SQLite soit compilé avec l'option: SQLITE_ENABLE_UPDATE_DELETE_LIMIT Ce qui ne semble pas être le cas ici.

Source: https://www.sqlite.org/compile.html#ena ... lete_limit
:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: SQLite et DELETE

Message par Ar-S »

Oui j'avais lu ça, d’où l'imbrication

Code : Tout sélectionner

WHERE "+ColDate$ + "= (SELECT
As tu une autre solution (requete) pour résoudre ce soucis ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: SQLite et DELETE

Message par Marc56 »

J'aimerai faire en sorte de pouvoir limiter la suppression de lignes avec les même données X dans une certaine limit.
...
DELETE FROM datetest WHERE dateR= (SELECT dateR FROM datetest WHERE dateR='2022-04-04' ORDER BY dateR ASC LIMIT 1)
J'ai un peu de mal à comprendre ce que tu veux faire ?
Si c'est juste supprimer les doublons ? (SELECT DISTINCT) ou autre-chose ?
:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: SQLite et DELETE

Message par Ar-S »

Non,

Je veux supprimer la 1ere occurrence d'une date A lorsque dans la base j'ai.

C
B
A <- virer la 1ère trouvée dans un sens donné (ASC ou DESC)
D
F
A
A
V
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: SQLite et DELETE

Message par case »

ImageImage
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: SQLite et DELETE

Message par Marc56 »

Comme les ID sont attribués séquentiellement et non réutilisés, tu peux faire comme ceci si tu veux supprimer le premier entré dans la sélection.

Code : Tout sélectionner

DELETE FROM datetest
      WHERE id = (
                     SELECT min(id) 
                       FROM datetest
                      WHERE dateR = '2022-10-05 12:00:00'
                 );
(Testé)
Il y a surement plus simple, je ne connais que les bases du SQL.

PS. En SQLite, tu peux utiliser aussi les rowid (ils ne sont affichées qu'à la demande)

Code : Tout sélectionner

SELECT rowid, * FROM ...
Pour ne pas casser ta base à chaque essai, tu peux utiliser les transactions.

Code : Tout sélectionner

BEGIN <tests> puis COMMIT ou ROLLBACK
:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: SQLite et DELETE

Message par Ar-S »

@case, j'ai exploré pas mal de solution, ça ne passe pas. Surement du fait que le SQLite PB n'ai pas l'option SQLITE_ENABLE_UPDATE_DELETE_LIMIT

@Marc56

Code : Tout sélectionner

DELETE FROM datetest
      WHERE id = (
                     SELECT min(id) 
                       FROM datetest
                      WHERE dateR = '2022-10-05 12:00:00'
                 );
C'est pas con du tout. Je vais tester ça demain.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: SQLite et DELETE

Message par Ollivier »

ArS a écrit :

Code : Tout sélectionner

;Requete$ = "DELETE FROM "+TableName$+ " WHERE "+ColDate$ + "='"+Ladate$+"' ORDER BY "+ColDate$+" ASC LIMIT "+l$
Au risque de passer pour une bille, il ne manquerait pas des guillemets ou apostrophes ? À part à Ladate$, à l$ par exemple ?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: SQLite et DELETE

Message par Ar-S »

Non, la requete doit afficher LIMIT 1
Et ColDate est le nom de la colonne donc pas besoin. Seule Ladate$ doit être entouré de '
La requête donne ça :

Code : Tout sélectionner

DELETE FROM testdate WHERE dateR = '2020-xx-xx' ORDER BY dateR ASC LIMIT 1
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: SQLite et DELETE

Message par Ollivier »

Et c'est bien '2020-xx-xx' ?
Pas '2020-mm-dd' ?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: SQLite et DELETE

Message par Ar-S »

Oui les xx pour l'exemple
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [OK]SQLite et DELETE

Message par Ar-S »

@Marc56 C'est OK avec ta requête. Merci encore.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre