lundi 30 novembre 2015

SQLlite: strange "Abort due to constraint violation"

I'm trying to rename a column of a table. I have a lot of tables with the word "couleur" and I renamed "manually" to "bulle".

I've successfully renamed main_groupecouleurs to main_groupebulles. Now i'm working on main_groupe. I'm trying to rename groupe_couleurs_id to groupe_bulles_id

The SQL is quite self-explaining:

BEGIN TRANSACTION;
DROP INDEX main_groupe_fc5cee5b;
CREATE TABLE main_groupe7e12
(
    id INTEGER PRIMARY KEY NOT NULL,
    description TEXT NOT NULL,
    exemple TEXT,
    groupe_bulles_id INTEGER DEFAULT NULL,
    reference TEXT,
    FOREIGN KEY (groupe_bulles_id) REFERENCES main_groupebulles(id)
        DEFERRABLE INITIALLY DEFERRED
);
CREATE UNIQUE INDEX main_groupe_fc5cee5b ON main_groupe7e12 (groupe_bulles_id);
INSERT INTO main_groupe7e12(id, description, exemple, groupe_bulles_id, reference)
                     SELECT id, description, exemple, groupe_couleurs_id, reference
                     FROM main_groupe;
DROP TABLE main_groupe;
ALTER TABLE main_groupe7e12 RENAME TO main_groupe;
COMMIT;

When I run it, I get:

[SQLITE_CONSTRAINT]  Abort due to constraint violation
    (UNIQUE constraint failed: main_groupe7e12.groupe_bulles_id)

This means (I think I'm wrong here but I dont know what I'm missing) that it tries to insert some groupe_couleurs_id that are not in the referring table (= main_groupebulles). Thus I tried to see in the original table the problem:

SELECT * FROM main_groupe WHERE groupe_couleurs_id NOT IN (
    SELECT id FROM main_groupebulles
);

I got no rows! What am I missing?

Aucun commentaire:

Enregistrer un commentaire