表中绝对没有数据时的主键违规

问题描述:

我有一个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数据库。对于生产环境来说这看起来不太稳定。 –

这很奇怪。您没有为PRIMARY键字段(id)提供数据,这对于自动增量而言是明智的,因此应该不可能在该字段上获得重复的键错误。

我能看到的唯一可能是该字段的auto_increment计数器在某种程度上不同步。如果您删除并重新创建表,这也应该是不可能的。

你可以尝试以下,以保证计数器设置为零:

ALTER TABLE user_profiles AUTO_INCREMENT=0; 

另外,如果你想成为100%肯定该表是空的,并且自动递增计数器复位,发出以下声明:

TRUNCATE TABLE user_profiles; 

这将删除所有数据并重置/清除索引。

最后的可能性探索将是你的代码是否意外地尝试插入行两次 - 但我不认为这是问题,因为这会给你在UID字段上重复键错误,而不是ID字段。

+0

这当然是与谷歌云的SQL。所有的代码完全适用于我的本地mysql实例。不仅如此,我没有放弃我放弃整个模式的表格!我会尝试你的截断和自动增量= 0的建议。 –

+0

是的,当然看起来像云数据库可能会以某种方式缓存数据文件。 为了证明这一点,你可以尝试用一个非常不同的名字重新创建表格(就像一个测试)。 –