Skip to content

约束

约束是对列施加的规则,防止无效数据。

DEFAULT

ts
const table = pgTable("table", {
  integer1: integer("integer1").default(42),
  integer2: integer("integer2").default(sql`'42'::integer`),

  // 下面两个生成一样的sql语句
  uuid1: uuid("uuid1").defaultRandom(),
  uuid2: uuid("uuid2").default(sql`gen_random_uuid()`),
});

NOT NULL

ts
const table = pgTable("table", {
  integer: integer("integer").notNull(),
});

约束:主键

表中的每条记录的唯一标识,可以是多个字段的组合,不能为 null

表的“身份证”。

ts
const user = pgTable("user", {
  id: serial("id").primaryKey(),
});

复合主键

ts
export const booksToAuthors = pgTable(
  "books_to_authors",
  {
    authorId: integer("author_id"),
    bookId: integer("book_id"),
  },
  (table) => [
    primaryKey({ columns: [table.bookId, table.authorId] }),
    // Or PK with custom name
    primaryKey({
      name: "custom_name",
      columns: [table.bookId, table.authorId],
    }),
  ]
);

sql 参考

sql
CREATE TABLE IF NOT EXISTS "books_to_authors" (
  "author_id" integer,
  "book_id" integer,
  PRIMARY KEY("book_id","author_id")
);

UNIQUE 唯一

UNIQUE 确保列中的所有值都是不同的。

PRIMARY KEY 约束自动具有 UNIQUE 约束

ts
export const user = pgTable(
  "user",
  {
    // 默认的名称为 user_id_unique
    id: integer("id").unique(),

    // 自定义名称
    id: integer("id").unique("custom_name"),

    name: text("name"),
  },
  //
  //
  // !!!复合唯一约束!!!
  (t) => [
    // 默认的名称为 composite_example_id_name_unique
    unique().on(t.id, t.name),
    // 自定义名称
    unique("custom_name").on(t.id, t.name),
  ]
);

复合唯一约束

多个字段的组合在表中必须唯一

pg 15+

ts
export const userNulls = pgTable(
  "user_nulls_example",
  {
    id: integer("id").unique("custom_name", { nulls: "not distinct" }),
  },
  (t) => [unique().on(t.id).nullsNotDistinct()]
);

两种写法是一样的,意思是“只能插入一个 NULL”。

这与默认行为不同。

CHECK / 检查

限制值范围

ts
export const users = pgTable(
  "users",
  {
    id: uuid().defaultRandom().primaryKey(),
    username: text().notNull(),
    age: integer(),
  },
  (table) => [
    // CONSTRAINT "age_check1" CHECK ("users"."age" > 21)
    check("age_check1", sql`${table.age} > 21`),
  ]
);

外键 / FOREIGN KEY

todo

ts
import { serial, text, integer, pgTable } from "drizzle-orm/pg-core";
export const user = pgTable("user", {
  id: serial("id"),
  name: text("name"),
});
export const book = pgTable("book", {
  id: serial("id"),
  name: text("name"),
  authorId: integer("author_id").references(() => user.id),
});