web-dev-qa-db-fra.com

Comment supprimer une contrainte d'une table sqlite (3.6.21)?

J'ai le tableau suivant:

CREATE TABLE child( 
  id INTEGER PRIMARY KEY, 
  parent_id INTEGER CONSTRAINT parent_id REFERENCES parent(id), 
  description TEXT);

Comment supprimer la contrainte?

51
Dane O'Connor

SQLite ne prend pas en charge (à partir de cette réponse) le alter table drop constraint commande. La syntaxe autorisée peut être vue ici . Vous devrez créer une nouvelle table sans contrainte, transférer les données, puis supprimer l'ancienne table.

Je pense que quelque chose comme ce qui suit devrait fonctionner:

CREATE TABLE child2 ( 
    id          INTEGER PRIMARY KEY, 
    parent_id   INTEGER,
    description TEXT
);
INSERT INTO child2 (id, parent_id, description)
   SELECT id, parent_id, description FROM CHILD;
DROP TABLE child;
ALTER TABLE child2 RENAME TO child;

Notez que le insert into pourrait probablement être simplifié pour ne pas utiliser des noms de colonnes explicites mais je l'ai laissé de cette façon au cas où vous voudriez aussi changer la structure.

Par exemple, si vous supprimez la contrainte sur le parent_id colonne, il est d'une utilité douteuse de l'y maintenir. Dans ce cas, vous pouvez modifier le transfert de données pour:

CREATE TABLE child2 (id INTEGER PRIMARY KEY, description TEXT);
INSERT INTO child2 (id, description) SELECT id, description FROM CHILD;
85
paxdiablo

Je pense que c'est une approche plus simple et plus concise:

copy db.sqlite3 backup-db.sqlite3
echo .dump tablename | sqlite3 db.sqlite3 > modify.sql
(now delete or change the constraint in modify.sql)
echo drop table tablename; | sqlite3 db.sqlite3 
sqlite3 db.sqlite3 < modify.sql

Vous pouvez maintenant redéfinir la nouvelle table de base de données et comparer les différences.

8
jftuga