约束
约束是对列施加的规则,防止无效数据。
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),
});