Error: ActiveRecord::UnknownPrimaryKey (Unknown primary key for table sources in model Source.)

如何排查解决主键丢失问题

问题的起因,是我们最近将生产服务器的数据导入本地数据库后,在Rails应用中做一些修改时得到的这个错误 (Unknown primary key for table)。个人猜测,主要是因为当在导入的时候,有人连接到数据库有所操作导致的。

接下来,我们来看看如何排查和修复这个问题。


1. 确认哪些表存在这样的情况,你可以使用下面的 SQL Query 得到丢失主键的表

SELECT tab.table_schema,
  tab.table_name
FROM information_schema.tables tab
  LEFT JOIN information_schema.table_constraints tabcons
  ON tab.table_schema = tabcons.table_schema
  AND tab.table_name = tabcons.table_name
  AND tabcons.constraint_type = 'PRIMARY KEY'
WHERE tab.table_type = 'BASE TABLE'
  AND tab.table_schema NOT IN('pg_catalog', 'information_schema')
  AND tabcons.constraint_name IS NULL
  ORDER BY table_schema,
  table_name;
----

 table_schema |     table_name
--------------+---------------------
 public       | sources
 public       | schema_migrations
(4 rows)

从结果中可以看出没有主键的表 [sources]

2. 删除重复的数据在这些丢失主键的表

SELECT id FROM sources GROUP BY id HAVING COU(id) > 1;
DELETE FROM sources WHERE id = 1 AND name = 'API';

3. 重新添加主键给丢失主键的表

ALTER TABLE sources ADD PRIMARY KEY (id);

如果一切顺利,此时应该可以解决你的问题。

备注:当你在做重新导入数据库的时候,最好确保不要有外部的的连接,避免给你后面带来额外的开销处理这些脏数据。