2016-07-27 43 views
1

我有一個Google App Engine標準Env實例。我連接到Google Cloud SQL的應用程序有以下錯誤 -表中絕對沒有數據時的主鍵違規

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 = ? 

真奇怪的是user_profiles表是空的!

select count(*) from eplreflex.user_profiles 

count(*) 
0 

看起來像當我刪除並重新創建架構時,mysql實例仍舊以某種方式具有舊數據。究竟發生了什麼?如何刪除包括舊數據在內的所有內容?

下面是表定義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); 

更新

因此,我從表中的COUNT(*),並返回0

我嘗試截斷表,並給我

錯誤代碼:1701.不能截斷在外鍵約束中引用的表(eplreflexleaderboard_users,CONSTRAINT leaderboard_users_ibfk_1 FOREIGN KEY(user_id)參考文獻eplreflexuser_profilesid))

我選擇從leaderboard_users計數(*),也返回零!

某些事情與Google Cloud Sql嚴重混淆。

+0

它完全預計你不能截斷鏈表 - 這是正常的,即使是空表。 你能重置auto_increment計數器嗎? –

+0

每次我放棄架構並重新創建整個架構時,自動遞增計數器都會重置!我們決定不使用Cloud Sql並擁有自己的Mysql數據庫。對於生產環境來說這看起來不太穩定。 –

回答

0

這很奇怪。您沒有爲PRIMARY鍵字段(id)提供數據,這對於自動增量而言是明智的,因此應該不可能在該字段上獲得重複的鍵錯誤。

我能看到的唯一可能是該字段的auto_increment計數器在某種程度上不同步。如果您刪除並重新創建表,這也應該是不可能的。

你可以嘗試以下,以保證計數器設置爲零:

ALTER TABLE user_profiles AUTO_INCREMENT=0; 

另外,如果你想成爲100%肯定該表是空的,並且自動遞增計數器復位,發出以下聲明:

TRUNCATE TABLE user_profiles; 

這將刪除所有數據並重置/清除索引。

最後的可能性探索將是你的代碼是否意外地嘗試插入行兩次 - 但我不認爲這是問題,因爲這會給你在UID字段上重複鍵錯誤,而不是ID字段。

+0

這當然是與谷歌雲的SQL。所有的代碼完全適用於我的本地mysql實例。不僅如此,我沒有放棄我放棄整個模式的表格!我會嘗試你的截斷和自動增量= 0的建議。 –

+0

是的,當然看起來像雲數據庫可能會以某種方式緩存數據文件。 爲了證明這一點,你可以嘗試用一個非常不同的名字重新創建表格(就像一個測試)。 –