索引与约束

约束

SQL 约束是应用于表列上的规则。它们用于防止无效数据被输入到数据库中。

这可以确保你数据库中数据的准确性和可靠性。

默认值

DEFAULT 子句指定在用户执行 INSERT 时,如果没有提供值,则该列使用的默认值。
如果某个列定义上没有显式附加 DEFAULT 子句,
那么该列的默认值就是 NULL

显式的 DEFAULT 子句可以指定默认值为 NULL
字符串常量、blob 常量、有符号数字,或括在括号中的任何常量表达式。

import { sql } from "drizzle-orm";
import { int, time, singlestoreTable } from "drizzle-orm/singlestore-core";

const table = singlestoreTable("table", {
  int: int("int").default(42),
  time: time("time").default(sql`cast("14:06:10" AS TIME)`),
});
CREATE TABLE `table` (
  `int` int DEFAULT 42,
  `time` time DEFAULT cast("14:06:10" AS TIME)
);

非空

默认情况下,列可以包含 NULL 值。NOT NULL 约束强制列 接受 NULL 值。

这会强制字段始终包含一个值,这意味着你不能在不为该字段添加值的情况下插入新记录, 或者更新记录。

import { int, singlestoreTable } from "drizzle-orm/singlestore-core";

const table = singlestoreTable('table', {
  int: int('int').notNull(),
});
CREATE TABLE `table` (
  `int` int NOT NULL
);

唯一

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

UNIQUEPRIMARY KEY 约束都为某列或某组列提供唯一性保证。

PRIMARY KEY 约束会自动具有 UNIQUE 约束。

你可以为每个表设置多个 UNIQUE 约束,但每个表只能有一个 PRIMARY KEY 约束。

import { int, varchar, unique, singlestoreTable } from "drizzle-orm/singlestore-core";

export const user = singlestoreTable('user', {
  id: int('id').unique(),
});

export const table = singlestoreTable('table', {
  id: int('id').unique('custom_name'),
});

export const composite = singlestoreTable('composite_example', {
  id: int('id'),
  name: varchar('name', { length: 256 }),
}, (t) => [
  unique().on(t.id, t.name),
  unique('custom_name').on(t.id, t.name)
]);
CREATE TABLE `user` (
	`id` int,
	CONSTRAINT `user_id_unique` UNIQUE(`id`)
);

CREATE TABLE `table` (
	`id` int,
	CONSTRAINT `custom_name` UNIQUE(`id`)
);

CREATE TABLE `composite_example` (
  `id` int,
  `name` varchar(256),
  CONSTRAINT `composite_example_id_name_unique` UNIQUE(`id`,`name`),
  CONSTRAINT `custom_name` UNIQUE(`id`,`name`)
);

主键

PRIMARY KEY 约束用于唯一标识表中的每条记录。
主键必须包含 UNIQUE 值,并且不能包含 NULL 值。

一个表只能有一个 主键;并且在该表中,这个主键可以由单个或多个列(字段)组成。

import { int, text, singlestoreTable } from "drizzle-orm/singlestore-core";

export const user = singlestoreTable("user", {
  id: int("id").autoincrement().primaryKey(),
})

export const table = singlestoreTable("table", {
  cuid: text("cuid").primaryKey(),
})
CREATE TABLE `user` (
  `id` int AUTO_INCREMENT PRIMARY KEY NOT NULL
);

CREATE TABLE `table` (
  `cuid` text PRIMARY KEY NOT NULL
);

复合主键

PRIMARY KEY 类似,复合主键通过使用多个字段唯一标识表中的每条记录。

Drizzle ORM 为此提供了一个独立的 primaryKey 操作符:

import { int, text, primaryKey, singlestoreTable } from "drizzle-orm/singlestore-core";

export const user = singlestoreTable("user", {
  id: int("id").autoincrement().primaryKey(),
  name: text("name"),
});

export const book = singlestoreTable("book", {
  id: int("id").autoincrement().primaryKey(),
  name: text("name"),
});

export const booksToAuthors = singlestoreTable("books_to_authors", {
  authorId: int("author_id"),
  bookId: int("book_id"),
}, (table) => [
  primaryKey({ columns: [table.bookId, table.authorId] }),
  // 或者使用自定义名称的 PK
  primaryKey({ name: 'custom_name', columns: [table.bookId, table.authorId] }),
]);
...

CREATE TABLE `books_to_authors` (
  `author_id` int,
  `book_id` int,
  PRIMARY KEY(`book_id`,`author_id`)
);

索引

Drizzle ORM 为 indexunique index 声明都提供了 API:

import { int, text, index, uniqueIndex, singlestoreTable } from "drizzle-orm/singlestore-core";

export const user = singlestoreTable("user", {
  id: int("id").primaryKey().autoincrement(),
  name: text("name"),
  email: text("email"),
}, (table) => [
  index("name_idx").on(table.name),
  uniqueIndex("email_idx").on(table.email),
]);
CREATE TABLE `user` (
  ...
);

CREATE INDEX `name_idx` ON `user` (`name`);
CREATE UNIQUE INDEX `email_idx` ON `user` (`email`);