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?
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;
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.