diff --git a/generic-persistence.cabal b/generic-persistence.cabal
--- a/generic-persistence.cabal
+++ b/generic-persistence.cabal
@@ -1,12 +1,14 @@
 cabal-version:      1.12
 name:               generic-persistence
-version:            0.7.0.0
+version:            0.7.0.1
 license:            BSD3
 license-file:       LICENSE
 copyright:          2023,2024 Thomas Mahler
 maintainer:         thma@apache.org
 author:             Thomas Mahler
-tested-with:        ghc ==9.2 ghc ==9.4 ghc ==9.6 ghc ==9.8
+tested-with:
+    ghc ==9.2 ghc ==9.4 ghc ==9.6 ghc ==9.8 ghc ==9.10 ghc ==9.12
+
 homepage:           https://github.com/thma/generic-persistence#readme
 bug-reports:        https://github.com/thma/generic-persistence/issues
 synopsis:           Database persistence using generics
diff --git a/src/Database/GP/SqlGenerator.hs b/src/Database/GP/SqlGenerator.hs
--- a/src/Database/GP/SqlGenerator.hs
+++ b/src/Database/GP/SqlGenerator.hs
@@ -182,8 +182,8 @@
 columnTypeFor columnTypeMapping fieldName = columnTypeMapping fType
   where
     fType = 
-      if isIdField @a fieldName 
-        then "primaryKey"
+      if autoIncrement @a && isIdField @a fieldName 
+        then "AUTOINCREMENT"
         else maybe "OTHER" show $ maybeFieldTypeFor @a fieldName
 
 -- | A type alias for mapping a Haskell field type to a SQL column type.
@@ -194,7 +194,7 @@
 --   This mapping is used when no custom mapping is provided.
 defaultSqliteMapping :: ColumnTypeMapping
 defaultSqliteMapping = \case
-  "primaryKey" -> "INTEGER"
+  "AUTOINCREMENT" -> "INTEGER"
   "Int"    -> "INTEGER"
   "[Char]" -> "TEXT"
   "Double" -> "REAL"
@@ -206,7 +206,7 @@
 --   This mapping is used when no custom mapping is provided.
 defaultPostgresMapping :: ColumnTypeMapping
 defaultPostgresMapping = \case
-  "primaryKey" -> "serial"
+  "AUTOINCREMENT" -> "serial"
   "Int"    -> "numeric"
   "[Char]" -> "varchar"
   "Double" -> "numeric"
diff --git a/test/GenericPersistenceSpec.hs b/test/GenericPersistenceSpec.hs
--- a/test/GenericPersistenceSpec.hs
+++ b/test/GenericPersistenceSpec.hs
@@ -28,6 +28,7 @@
   setupTable @Book conn defaultSqliteMapping
   setupTable @Car conn defaultSqliteMapping
   setupTable @Boat conn defaultSqliteMapping
+  setupTable @BearerToken conn defaultSqliteMapping
   return conn
 
 -- | A data type with several fields, using record syntax.
@@ -89,6 +90,17 @@
 
   toRow _c b = pure [toSql (book_id b), toSql (title b), toSql (author b), toSql (year b), toSql (category b)]
 
+data BearerToken = BearerToken
+  { 
+    token   :: String,
+    expires :: Int
+  }
+  deriving (Generic, Show, Eq)
+
+instance Entity BearerToken where
+  autoIncrement = False
+  idField = "token"
+
 person :: Person
 person = Person 123456 "Alice" 25 "123 Main St"
 
@@ -200,6 +212,12 @@
       upsert conn boat2
       boat2' <- selectById conn (1 :: Int) :: IO (Maybe Boat)
       boat2' `shouldBe` Just boat2
+    it "can handle tables with non-numeric primary keys" $ do
+      conn <- prepareDB
+      let token = BearerToken "secret token" 202411271659
+      upsert conn token
+      token' <- selectById @BearerToken conn "secret token"
+      token' `shouldBe` Just token 
     it "persists new Entities using Generics" $ do
       conn <- prepareDB
       allPersons <- select conn allEntries :: IO [Person]
diff --git a/test/PostgresSpec.hs b/test/PostgresSpec.hs
--- a/test/PostgresSpec.hs
+++ b/test/PostgresSpec.hs
@@ -24,6 +24,7 @@
   setupTable @Person conn defaultPostgresMapping
   setupTable @Book conn defaultPostgresMapping
   setupTable @Boat conn defaultPostgresMapping 
+  setupTable @BearerToken conn defaultPostgresMapping
   _ <- run conn "DROP TABLE IF EXISTS Car;" []
   _ <- run conn "CREATE TABLE Car (carID serial4 PRIMARY KEY, carType varchar);" []
   commit conn
@@ -84,6 +85,17 @@
 
   toRow _c b = pure [toSql (book_id b), toSql (title b), toSql (author b), toSql (year b), toSql (category b)]
 
+data BearerToken = BearerToken
+  { 
+    token   :: String,
+    expires :: Int
+  }
+  deriving (Generic, Show, Eq)
+
+instance Entity BearerToken where
+  autoIncrement = False
+  idField = "token"
+
 person :: Person
 person = Person 123456 "Alice" 25 "123 Main St"
 
@@ -248,7 +260,13 @@
       boat2' <- selectById conn (1 :: Int) :: IO (Maybe Boat)
       boat2' `shouldBe` Just boat2
       commit conn
-
+    it "can handle tables with non-numeric primary keys" $ do
+      conn <- prepareDB
+      let token = BearerToken "secret token" 202411271659
+      upsert conn token
+      token' <- selectById @BearerToken conn "secret token"
+      token' `shouldBe` Just token 
+      commit conn
     it "inserts Entities using Generics" $ do
       conn <- prepareDB
       allPersons <- select conn allEntries :: IO [Person]
