Page 1 sur 1

[RESOLU]Supprimer une colonne d'une table (sqlite)

Publié : lun. 16/mai/2011 19:30
par anissa
Bonjour,

Je ne comprends pas pourquoi ce code ne marche pas:

Code : Tout sélectionner

Wsql="ALTER TABLE MaTable DROP Matricule INT"
CheckDataBaseUpdate(Idb,Wsql)


Ce qui es bizarre, c'est que j'ai déjà utilisé quelque part cette instruction avec succès. Aujourd’hui, ça ne marche plus, regardez ce code modifié:

Code : Tout sélectionner

Wsql="ALTER TABLE MaTable DROP Matricule"
CheckDataBaseUpdate(Idb,Wsql)


Dans les deux cas, je reçois un message d'erreur:

"Near DROP syntax error"

Pour ne pas perdre de temps, j'ai alors utilisé un autre moyen pour avancer mon projet:
Supprimer complètement la table et la recréer avec la nouvelle structure:

Code : Tout sélectionner

Wsql="DROP TABLE MaTable"
CheckDataBaseUpdate(Idb,Wsql)


Ce dernier code marche bien, (heureusement)...

Qu'en pensez-vous?

Re: Supprimer une colonne d'une table (sqlite)

Publié : lun. 16/mai/2011 22:08
par nash
la version sqlite actuelle
ne permet pas de droper une colonne
donc:

tb1=table a supprimer
tb2=table a recreer(avec colonne en moins)
cs$=colonne a supprimer
i=nombre de colonnes dans tb1
c$=nom de la colonne dans tb1

par mesure de securité, il et preferable de
d'utiliser les commande begin et commit
(si erreur entre les deux appels le drop
ne passe pas et la tb1 et conservée)

OpenDatabase(0,base,"","")
OpenDatabase(1,base,"","")
a=0
DatabaseUpdate(0,"BEGIN")
databasequery(1,"select * from tb1")
for i=0 to DatabaseColumns(1)-1
c$=DatabaseColumnName(1, i)
t=databasecolumntype(1,i)
select t
case #PB_Database_String
t$="text"
case...(et suivant)
endselect
if c$<>cs$
if a=0
databaseupdate(0,"create table tb2 (c$ t$)"):a=1
DatabaseUpdate(0,"insert into tb2 select c$ from tb1")
else
databaseupdate(0,"alter table tb2 add column c$ t$")
DatabaseUpdate(0,"insert into tb2 select c$ from tb1")
endif
endif
next
DatabaseUpdate(0,"drop table tb1")
finishdatabasequery(1):closedatabase(1)
DatabaseUpdate(0,"COMMIT")
CloseDatabase(0)

une autre solution prudente avant de droper tb1
databaseupdate(0,"create temporary table tb2 select tb1")
DatabaseUpdate(0,"insert into tb2 select c$ from tb1")
dans la boucle
attention utilisation possible des chr(34) et ou chr(39)

avant de closer(0)
si la table represente de nombreux enregistrements
utilisation preconisée de la commande
DatabaseUpdate(0,"VACUUM")

d'autres solutions existent egalement..

Re: Supprimer une colonne d'une table (sqlite)

Publié : lun. 16/mai/2011 22:12
par falsam
Pure Basic intègre la version 3.6.23 du moteur SQlite et ne permet pas de supprimer une colonne lors de l’exécution d'une requête du type ALTER TABLE ..... DROP COLUMN
http://www.sqlite.org a écrit :The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column,

Re: Supprimer une colonne d'une table (sqlite)

Publié : lun. 16/mai/2011 22:18
par nash
mes excuses mais,c'est vrai
je ne poste pas beaucoup
et je ne rappelle plus l'utilisation des codes et des quotes
je vais donc déjà voir cela
pour la suite

[RESOLU] Supprimer une colonne d'une table (sqlite)

Publié : mar. 17/mai/2011 19:01
par anissa
Tout ça ressemble à ce que j'ai fait forcément car j'ai confirmé que le Drop et Rename ne marchent pas quand il s'agit des colonnes mais pour les tables oui. C'est pour cette raison que j'ai fait comme ça:

Code : Tout sélectionner

;------------- Maj Structure table:  Supprimer une colonne  ------------------------
;
Procedure DeleteCol_FromTable()
;
;------------ NewTable est le nom de la table temporaire de travail 
;------------ MaTable est le nom de la table réelle
;------------ ColDeleted c'est le n° de la colonne à supprimer

;1. Supprimer la table de travail si elle existe
Wsql=  "SELECT Name FROM sqlite_master WHERE Type='table';" 
CheckDatabaseQuery(IdAny, WSql)
While NextDatabaseRow(IdAny)
Wtable$=GetDatabaseString(IdAny,0)
If WTable$="NewTable"
   wsql="DROP TABLE NewTable"
   CheckDatabaseUpdate(IdAny, wsql)
   Break
EndIf
Wend

;2. Créer la table temporaire NewTable qui va contenir la nouvelle structure
Wsql=  "CREATE TABLE NewTable (id INTEGER NOT NULL PRIMARY KEY)"
CheckDatabaseUpdate(IdAny, wsql)

;3.Création de la nouvelle structure (dans cet intervalle seules les colonnes réelles existent)
for wcol=1 to WMaxcol
    wName$=ColName$(Wcol)
    wType$=ColType$(Wcol)
    wSize$=ColSize$(Wcol)

    ;Ajouter la colonne 
    Wsql=  "ALTER TABLE NewTable" +  " ADD " + wName$ + Space(1) + WType$ 
    CheckDatabaseUpdate(IdAny, wsql)
next wcol

;4. Récupérer les données à partir de la table originale
NewCol=0
Wsql="SELECT * FROM MaTable order by Id"
CheckDatabaseQuery(IdAny, WSql)
While NextDatabaseRow(IdAny)
Wid=GetDatabaseLong(IdAny,0)
For Wcol=1 To DatabaseColumns(IdAny) -1
    WData$(Wcol)=Trim(GetDatabaseString(IdAny,Wcol))
    If Wcol<>ColDeleted
       NewCol=NewCol+1
       wNewData$(NewCol)=WData$(Wcol)
    EndIf            
Next Wcol

wMaxCol=NewCol
For Wcol=1 To wMaxCol
Wsql="SELECT * FROM NewTable Where ID=" + Chr(34)+ Str(wid) + Chr(34)
CheckDatabaseQuery(IdAny, WSql)
If NextDatabaseRow(IdAny)
   wSql="Update NewTable set " + DatabaseColumnName(IdAny,Wcol) + " = " + Chr(34) + wNewData$(wCol) + Chr(34)
   wsql+"Where ID=" + Chr(34)+ Str(wid) + Chr(34)
   CheckDatabaseUpdate(IdAny, wsql)
Else
   wSql="INSERT INTO NewTable (" + DatabaseColumnName(IdAny,Wcol)+") Values ("  + Chr(34) + wNewData$(wCol) + Chr(34) + ")"
   CheckDatabaseUpdate(IdAny, wsql)
EndIf   
Next wcol
Wend

;5. Supprimer la table MaTable
Wsql=  "Drop Table MaTable"
CheckDatabaseUpdate(IdAny, wsql)

;6.Renommer la nouvelle table sous le nom original
;wsql="ALTER TABLE NewTable RENAME To MaTable"
;CheckDatabaseUpdate(IdAny, wsql)

MessageRequester("Terminé","La colonne N°" + str(DeletedCol) + " a été supprimée !")
EndProcedure


Je ne peux pas vous dire que c'est parfait car ce n'est pas vrai au contraire, ça n'a pas marché à tous les coups ! Des fois oui des fois non... Il y a sûrement qq chose qui cloche dans mon code...