Become a Gold Sponsor
DrizzleORM v0.27.2 发布
Jul 12, 2023

🎉 增加了对 PostgreSQL、MySQL、SQLite 中 UNIQUE 约束的支持

对于 PostgreSQL,唯一约束可以在单列约束的列级别定义,并在多列约束的第三个参数中定义。在这两种情况下,都可以为约束定义一个自定义名称。此外,PostgreSQL 将提供 NULLS NOT DISTINCT 选项,以限制表中包含多个 NULL 值。参考

以下示例只是展示了不同的 unique 使用方式。请不要搜索这些表的实际使用情况。

// 单列
const table = pgTable('table', {
  id: serial('id').primaryKey(),
  name: text('name').notNull().unique(),
  state: char('state', { length: 2 }).unique('custom'),
  field: char('field', { length: 2 }).unique('custom_field', { nulls: 'not distinct' }),
});
// 多列
const table = pgTable('table', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  state: char('state', { length: 2 }),
}, (t) => ({
  first: unique('custom_name').on(t.name, t.state).nullsNotDistinct(),
  second: unique('custom_name1').on(t.name, t.state),
}));

对于 MySQL,所有内容与 PostgreSQL 相同,除了 NULLS NOT DISTINCT 选项。MySQL 似乎不支持此功能。

以下示例只是展示了不同的 unique 使用方式。请不要搜索这些表的实际使用情况。

// 单列
const table = mysqlTable('table', {
    id: serial('id').primaryKey(),
    name: text('name').notNull().unique(),
    state: text('state').unique('custom'),
    field: text('field').unique('custom_field'),
});
// 多列
const table = mysqlTable('cities1', {
    id: serial('id').primaryKey(),
    name: text('name').notNull(),
    state: text('state'),
}, (t) => ({
    first: unique().on(t.name, t.state),
    second: unique('custom_name1').on(t.name, t.state),
}));

在 SQLite 中,唯一约束与唯一索引相同。只要您能够为 SQLite 中的唯一索引指定一个名称,我们将在内部实现中将所有唯一约束视为唯一索引。

// 单列
const table = sqliteTable('table', {
    id: int('id').primaryKey(),
    name: text('name').notNull().unique(),
    state: text('state').unique('custom'),
    field: text('field').unique(),
});
// 多列
const table = sqliteTable('table', {
    id: int('id').primaryKey(),
    name: text('name').notNull(),
    state: text('state'),
}, (t) => ({
    first: unique().on(t.name, t.state),
    second: unique('custom').on(t.name, t.state),
}));