SQLite IntegrityError: UNIQUE constraint failed:

Fragkiller picture Fragkiller · Mar 13, 2015 · Viewed 81.4k times · Source

I am just getting an weird error:

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

My SQL QUERY:

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)

Log output:

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

My Database structure:

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)
)

As the topic says, im always getting SQLite IntegrityError: UNIQUE constraint failed:

Answer

Paul Griffin picture Paul Griffin · Mar 13, 2015

The UNIQUE clause of your table's declaration states that every row's combination of player_id, map_id, and runID must be unique. You are getting this error because there is already a row in the jumptimes table withplayer_id = 13, map_id = 34, and runID = 0.

Here is a simple SQLFiddle reproducing the error. The "constraint" the error is talking about is the UNIQUE clause, and if you could see the full error, it would be the same as the one you're getting.