web-dev-qa-db-fra.com

SQLite IntegrityError: Échec de la contrainte UNIQUE:

Je reçois juste une erreur bizarre:

IntegrityError: UNIQUE constraint failed: jumptimes.player_id, jumptimes.map_id, jumptimes.runID

Ma requête SQL:

t = (playerid, mapid, timeTaken, (time() if not dateOverwrite else dateOverwrite), runID, runLeaveZoneVelocity, EnterZoneVelocity, averageVelocity, time())
log("PlayerID: %s | mapid: %s | timeTaken: %s | Date: %s | runID: %s | rlvz: %s | ezv: %s | avgvel: %s | firstFinish: %s" % t)
execute("INSERT INTO jumptimes (player_id, map_id, duration, date, runID, LeaveZoneVelocity, enterZoneVelocity, averageVelocity, firstFinish) VALUES (?,?,?,?,?,?,?,?,?)", t)

Sortie du journal:

17:45:11 - PlayerID: 13 | mapid: 34 | timeTaken: 55.2569999695 | Date: 1426265111.18 | runID: 0 | rlvz: 315.484661963 | ezv: 1159.06484472 | avgvel: 1374.49441131 | firstFinish: 1426265111.18

Ma structure de base de données:

CREATE TABLE IF NOT EXISTS jumptimes (
     id INTEGER PRIMARY KEY AUTO_INCREMENT,
     player_id INTEGER REFERENCES players ON DELETE CASCADE,
     map_id INTEGER REFERENCES maps ON DELETE CASCADE,
     duration REAL,
     `date` REAL,
     runID INTEGER,
     leaveZoneVelocity INTEGER DEFAULT 0,
     enterZoneVelocity INTEGER DEFAULT 0,
     averageVelocity INTEGER DEFAULT 0,
     server INTEGER DEFAULT 0,
     firstFinish REAL,
     completions INTEGER DEFAULT 1,
     UNIQUE (player_id, map_id, runID)
)

Comme le dit le sujet, je reçois toujours SQLite IntegrityError: UNIQUE constraint failed:

10
Fragkiller

La clause UNIQUE de la déclaration de votre table indique que la combinaison de chaque ligne de player_id, map_id et runID doivent être uniques. Vous obtenez cette erreur car il existe déjà une ligne dans la table jumptimes withplayer_id = 13, map_id = 34, et runID = 0.

Voici un simple SQLFiddle reproduisant l'erreur. La "contrainte" dont parle l'erreur est la clause UNIQUE, et si vous pouviez voir l'erreur complète, ce serait la même que celle que vous obtenez.

20
Paul Griffin