生成列
存储型(或持久化)生成列:这些列会在行插入或更新时计算,并且它们的值会存储在数据库中。这使得它们可以建立索引,并且由于查询时无需重新计算这些值,可以提升查询性能。
数据库端
类型:仅 STORED
工作方式
- 在插入或更新期间,基于其他列自动计算值。
能力
- 通过预先计算复杂表达式,简化数据访问。
- 借助生成列上的索引支持,提升查询性能。
限制
- 不能指定默认值。
- 表达式不能引用其他生成列,也不能包含子查询。
- 修改生成列表达式需要进行模式变更。
- 不能直接用于主键、外键或唯一约束
更多信息请查看 CockroachDB 文档
Drizzle 端
在 Drizzle 中,你可以在任何列类型上指定 .generatedAlwaysAs() 函数,并添加受支持的 SQL 查询,
这样就会为你生成该列的数据。
特性
这个函数可以通过两种方式接受生成表达式:
sql 标签 - 如果你希望 drizzle 帮你转义某些值
export const test = cockroachTable("test", {
generatedName: string("gen_name").generatedAlwaysAs(sql`'hello "world"!'`),
});CREATE TABLE "test" (
"gen_name" text GENERATED ALWAYS AS ('hello "world"!') STORED
);callback - 如果你需要引用某个表中的列
export const test = cockroachTable("test", {
name: string("first_name"),
generatedName: string("gen_name").generatedAlwaysAs(
(): SQL => sql`'hi, ' || ${test.name} || '!'`
),
});CREATE TABLE "test" (
"first_name" string,
"gen_name" string GENERATED ALWAYS AS ('hi, ' || "test"."first_name" || '!') STORED
);示例:带全文搜索的生成列
schema.ts
import { SQL, sql } from "drizzle-orm";
import { customType, index, int4, cockroachTable, string } from "drizzle-orm/cockroach-core";
const tsVector = customType<{ data: string }>({
dataType() {
return "tsvector";
},
});
export const test = cockroachTable(
"test",
{
id: int4("id").primaryKey().generatedAlwaysAsIdentity(),
content: string("content"),
contentSearch: tsVector("content_search", {
dimensions: 3,
}).generatedAlwaysAs(
(): SQL => sql`to_tsvector('english', ${test.content})`
),
},
(t) => [
index("idx_content_search").using("gin", t.contentSearch)
]
);CREATE TABLE "test" (
"id" int4 PRIMARY KEY GENERATED ALWAYS AS IDENTITY (INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
"content" string,
"content_search" tsvector GENERATED ALWAYS AS (to_tsvector('english', "test"."content")) STORED
);
CREATE INDEX "idx_content_search" ON "test" USING gin ("content_search");