diff --git a/modules/system/system.install b/modules/system/system.install
index fa2ef8b..e0d8287 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -381,9 +381,17 @@ function system_install() {
   db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
   // This sets uid 1 (superuser). We skip uid 2 but that's not a big problem.
   db_query("UPDATE {users} SET uid = 1 WHERE name = '%s'", 'placeholder-for-uid-1');
+  // Fix users_uid_seq for PostgreSQL after the uid shenanigans above
+  if ($GLOBALS['db_type'] == 'pgsql') {
+    db_query("SELECT setval('{users}_uid_seq', (SELECT MAX(uid) FROM {users})+1)");
+  }
 
   db_query("INSERT INTO {role} (rid,name) VALUES (" . DRUPAL_ANONYMOUS_RID . ",'anonymous user')");
   db_query("INSERT INTO {role} (rid,name) VALUES (" . DRUPAL_AUTHENTICATED_RID . ",'authenticated user')");
+  // Fix role_rid_seq for PostgreSQL, I'm not sure why this is needed
+  if ($GLOBALS['db_type'] == 'pgsql') {
+    db_query("SELECT setval('{role}_rid_seq', (SELECT MAX(uid) FROM {users})+1)");
+  }
 
   db_query("INSERT INTO {permission} (rid, perm, tid) VALUES (%d, '%s', %d)", DRUPAL_ANONYMOUS_RID, 'access content', 0);
   db_query("INSERT INTO {permission} (rid, perm, tid) VALUES (%d, '%s', %d)", DRUPAL_AUTHENTICATED_RID, 'access comments, access content, post comments, post comments without approval', 0);
