【问题标题】:Primary key violation when there is absolutely no data in table表中绝对没有数据时主键违规
【发布时间】:2016-07-27 10:25:16
【问题描述】:

我有一个 Google App Engine 标准环境实例。我连接到 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 实例仍然以某种方式包含旧数据。到底发生了什么?如何删除包括旧数据在内的所有内容?

顺便说一句,这是表定义

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。无法截断在外键约束中引用的表(eplreflex.leaderboard_users,CONSTRAINT leaderboard_users_ibfk_1 FOREIGN KEY (user_id) REFERENCES eplreflex.user_profiles (id ))

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

Google Cloud Sql 出现严重问题。

【问题讨论】:

  • 完全期望您不能截断链接表 - 这是正常的,即使是空表也是如此。你能重置 auto_increment 计数器吗?
  • 每次我删除架构并重新创建整个架构时,自动增量计数器都会重置!我们决定不使用 Cloud Sql 并拥有自己的 Mysql 数据库。对于生产环境,这看起来不太稳定。

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


【解决方案1】:

这很奇怪。您没有为 PRIMARY 键字段 (id) 提供数据,该字段设置为自动递增,因此应该不可能在该字段上出现重复键错误。

我能看到的唯一可能是该字段的 auto_increment 计数器不知何故不同步。如果您删除并重新创建表,这也应该是不可能的。

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

ALTER TABLE user_profiles AUTO_INCREMENT=0;

另外,如果你想 100% 确定表是空的,并且自动递增计数器被重置,请发出以下语句:

TRUNCATE TABLE user_profiles;

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

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

【讨论】:

  • 这肯定和google cloud sql有关。所有代码都与我的本地 mysql 实例完美配合。不仅如此,我只是没有删除表,而是删除了整个架构!我会尝试你的截断和自动增量=0 的建议。
  • 是的,看起来云 sql 可能会以其他方式缓存数据文件。为了证明这一点,您可以尝试使用稍微不同的名称重新创建表(仅作为测试)。
【解决方案2】:

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

我也尝试了西蒙的建议。

这对我来说也没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多