2016-07-27 17 views
1

Ich habe eine Google App Engine Standard Env-Instanz. Meine Anwendung, die Google Cloud SQL verbindet hat folgende Fehler -Primärschlüsselverletzung, wenn absolut keine Daten in der Tabelle vorhanden sind

Duplicate entry '1' for key 'PRIMARY' Query: INSERT INTO user_profiles 
(uid, name, profile_image_url, favourite_team_id, provider, admin) 
VALUES (?, ?, ?, ?, ?, ?) on duplicate key update name = ?, 
profile_image_url = ?, favourite_team_id = ?, provider = ?, admin = ? 

Was wirklich seltsam ist, dass die USER_PROFILES Tabelle leer ist!

select count(*) from eplreflex.user_profiles 

count(*) 
0 

Sieht aus wie wenn ich das Schema gelöscht und neu erstellt, die MySQL-Instanz noch irgendwie alte Daten enthält. Was genau ist los? Wie lösche ich alles einschließlich der alten Daten? Hier

ist die Tabellendefinition btw

CREATE TABLE `eplreflex`.`user_profiles` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `uid` VARCHAR(200) NOT NULL, 
    `name` VARCHAR(200) NOT NULL, 
    `profile_image_url` VARCHAR(400) NOT NULL, 
    `favourite_team_id` INT NULL, 
    `provider` VARCHAR(100) NULL, 
    `email` VARCHAR(100) NULL, 
    `purchased_coins` double not null default 0, 
    `free_coins` double not null default 0, 
    `coins_won` double not null default 0, 
    `coins_lost` double not null default 0, 
    `admin` bool not null default 0, 
    `insert_ts` timestamp default current_timestamp, 
    `update_ts` timestamp default current_timestamp on update current_timestamp, 
    `ads_enabled` bool not null default 1, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY (`uid`), 
    INDEX (`favourite_team_id` ASC), 
    INDEX (`coins_won` ASC), 
    CONSTRAINT 
    FOREIGN KEY (`favourite_team_id`) 
    REFERENCES `eplreflex`.`teams` (`id`) 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT); 

aktualisieren

So mache ich eine count (*) aus der Tabelle und es gibt 0 zurück

ich versuchen, die Tabelle Kürzen und es gibt mir

Fehlercode: 1701. Kann eine Tabelle, die in einer Fremdschlüsseleinschränkung () referenziert wird, nicht abschneiden. leaderboard_users, CONSTRAINT leaderboard_users_ibfk_1 FREMDSCHLÜSSEL (user_id) REFERENZEN eplreflex. user_profiles (id))

Ich wählen count (*) von Leaderboard_users und das gibt auch Null zurück !!

Etwas ist ernsthaft mit Google Cloud Sql vermasselt.

+0

Es ist völlig zu erwarten, dass Sie eine verknüpfte Tabelle nicht abschneiden können - das ist normal, auch bei leeren Tabellen. Konnten Sie den Zähler auto_increment zurücksetzen? –

+0

Autoinkrement-Zähler wird jedes Mal zurückgesetzt, wenn ich das Schema lösche und das gesamte Schema erneut erstelle! Wir haben uns entschieden, Cloud Sql nicht zu verwenden und haben eine eigene Mysql-Datenbank. Dies sieht für eine Produktionsumgebung nicht sehr stabil aus. –

Antwort

0

Das ist ziemlich seltsam. Sie liefern keine Daten für das PRIMARY-Schlüsselfeld (id), das für die automatische Inkrementierung geeignet ist. Daher sollte es nicht möglich sein, einen doppelten Schlüsselfehler für dieses Feld zu erhalten.

Die einzige Möglichkeit, die ich sehen kann, ist, dass der auto_increment Zähler für dieses Feld irgendwie nicht synchron ist. Dies sollte auch nicht möglich sein, wenn Sie die Tabelle gelöscht und neu erstellt haben.

Sie können die folgenden versuchen, um sicherzustellen, dass der Zähler auf Null gesetzt wird:

ALTER TABLE user_profiles AUTO_INCREMENT=0; 

Auch, wenn Sie 100% sicher sein wollen, dass die Tabelle leer ist, und die Autoinkrement Zähler zurückgesetzt , geben Sie die folgende Anweisung aus:

TRUNCATE TABLE user_profiles; 

Dadurch werden alle Daten gelöscht und die Indizes zurückgesetzt/gelöscht. Die letzte Möglichkeit zu erkunden wäre, ob Ihr Code versehentlich versucht, die Zeile zweimal einzufügen - aber ich denke nicht, dass dies das Problem ist, weil das Ihnen einen doppelten Schlüsselfehler auf dem UID-Feld geben würde, nicht auf das ID-Feld.

+0

Dies ist sicherlich etwas mit Google Cloud SQL zu tun.Der gesamte Code funktioniert perfekt mit meiner lokalen mysql-Instanz. Nicht nur das, ich habe den Tisch nicht fallen lassen, ich habe das ganze Schema fallen gelassen! Ich werde versuchen, Ihre Vorschläge zu trunkieren und auto increment = 0. –

+0

Ja, sicherlich sieht Cloud sql möglicherweise die Datendateien in irgendeiner Weise anders aus. Um dies zu beweisen, könnten Sie versuchen, die Tabelle mit einem sehr anderen Namen (nur als Test) neu zu erstellen. –

Verwandte Themen