mirror of
https://github.com/jbranchaud/til
synced 2026-01-02 22:58:01 +00:00
49 lines
1.6 KiB
Markdown
49 lines
1.6 KiB
Markdown
# Create bigint Identity Column For Primary Key
|
|
|
|
Using the Drizzle ORM with Postgres, here is how we can create a table that
|
|
uses a [`bigint` data
|
|
type](https://orm.drizzle.team/docs/column-types/pg#bigint) as a primary key
|
|
[identity
|
|
column](https://www.postgresql.org/docs/current/ddl-identity-columns.html).
|
|
|
|
```typescript
|
|
import {
|
|
pgTable,
|
|
bigint,
|
|
text,
|
|
timestamp,
|
|
} from "drizzle-orm/pg-core";
|
|
|
|
// Users table
|
|
export const users = pgTable("users", {
|
|
id: bigint({ mode: 'bigint' }).primaryKey().generatedAlwaysAsIdentity(),
|
|
email: text("email").unique().notNull(),
|
|
name: text("name").notNull(),
|
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
|
});
|
|
```
|
|
|
|
There are a couple key pieces here:
|
|
|
|
1. We import `bigint` so that we can declare a column of that type.
|
|
2. We specify that it is a primary key with `.primaryKey()`.
|
|
3. We declare its default value as `generated always as identity` via
|
|
`.generatedAlwaysAsIdentity()`.
|
|
|
|
Note: you need to specify the `mode` for `bigint` or else you will see a
|
|
`TypeError: Cannot read properties of undefined (reading 'mode')` error.
|
|
|
|
If we run `npx drizzle-kit generate` the SQL migration file that gets
|
|
generated will contain something like this:
|
|
|
|
```sql
|
|
--> statement-breakpoint
|
|
CREATE TABLE IF NOT EXISTS "users" (
|
|
"id" bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "users_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1),
|
|
"email" text NOT NULL,
|
|
"name" text NOT NULL,
|
|
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
CONSTRAINT "users_email_unique" UNIQUE("email")
|
|
);
|
|
```
|