时间:2016-07-27 10:25:17

标签: mysql google-app-engine google-cloud-sql

我有一个Google App Engine Standard 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)REFERENCES {{1 } {。eplreflexuser_profiles))

我从leaderboard_users中选择count(*)并返回零!!

Google Cloud Sql严重搞砸了。

2 个答案:

答案 0 :(得分:0)

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

我能看到的唯一可能是该字段的auto_increment计数器以某种方式不同步。如果删除并重新创建表,也不应该这样做。

您可以尝试以下操作,以确保计数器设置为零:

ALTER TABLE user_profiles AUTO_INCREMENT=0;

此外,如果您想100%确定该表为空,并且重置了自动增量计数器,请发出以下语句:

TRUNCATE TABLE user_profiles;

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

探索的最后一种可能性是您的代码是否意外地尝试将行插入两次 - 但我不认为这是问题所在,因为这会在UID文件中出现重复的密钥错误,而不是在ID字段上。

答案 1 :(得分:0)

我今天在本地MySQL数据库中遇到了这个问题,它是一个触发器,它正在将数据复制到创建时的另一个表中。卸下触发器可避免该错误。

我也尝试了西蒙的建议。

对我来说也没有意义。