You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Drizzle Schema中手机号约束与ID最小值配置失效问题

问题修复方案

一、手机号约束失效的修复

你的手机号约束存在三个核心问题:

  • PostgreSQL中字符串长度判断需用char_length()函数,而非.length语法
  • 原正则表达式匹配的是带格式的手机号(含括号、横线等),不符合纯数字10位的需求
  • 两个手机号check约束使用了相同名称phone_number,导致约束被覆盖

修正后的约束代码

在表定义的约束数组中修改为:

numberLengthConstraint: check('phone_number_length', sql`char_length(${table.phoneNumber}) = 10`),
numberContentConstraint: check('phone_number_digits', sql`${table.phoneNumber} ~ '^\\d{10}$'`),
  • char_length():PostgreSQL标准字符串长度计算函数,确保统计真实字符数
  • ^\\d{10}$:严格匹配10位纯数字的正则(JS中需转义反斜杠)
  • 给每个约束设置唯一名称,避免冲突覆盖

二、id字段设置最小值的方法

serial类型是PostgreSQL自动生成的序列+整数快捷方式,设置最小值有两种方式:

方法1:直接修改现有序列(执行SQL)

若表已创建,在数据库中执行SQL修改序列起始值:

ALTER SEQUENCE user_id_seq START WITH 1000; -- 替换1000为你需要的最小值

方法2:在Drizzle中自定义序列

若要在代码中定义,替换原serial('id'):

// 先导入pgSequence
import { ..., pgSequence } from "drizzle-orm/pg-core";

// 定义序列并设置起始值、最小值
const userIdSeq = pgSequence('user_id_seq')
  .start(1000)
  .minValue(1000);

// 关联到id字段
id: integer('id').primaryKey().default(sql`nextval('user_id_seq')`),

三、email正则约束优化(可选)

你的email正则存在冗余斜杠,虽已生效但可简化:

emailConstraint: check('email_format', sql`${table.email} ~ '^\\S+@\\S+\\.\\S+$'`),

完整修正代码

import { integer, text, boolean, pgTable, timestamp, check, pgSequence } from "drizzle-orm/pg-core";
import { sql } from 'drizzle-orm'

// 自定义id序列(按需启用)
const userIdSeq = pgSequence('user_id_seq')
  .start(1000)
  .minValue(1000);

export const userTable = pgTable("user", {
    id: integer('id').primaryKey().default(sql`nextval('user_id_seq')`),
    firstName: text("first_name").notNull(),
    lastName: text("last_name").notNull(),
    email: text("email").notNull().unique(),
    phoneNumber: text("phone_number").notNull().unique(),
    password: text("password").notNull(),
    isAdmin: boolean("is_admin").notNull().default(false),
    createdAt: timestamp("created_at").notNull().default(new Date())
},
    (table) => [
        userIdSeq,
        check('phone_number_length', sql`char_length(${table.phoneNumber}) = 10`),
        check('phone_number_digits', sql`${table.phoneNumber} ~ '^\\d{10}$'`),
        check('email_format', sql`${table.email} ~ '^\\S+@\\S+\\.\\S+$'`)
    ]
);

关键提示

修改代码后,需重新生成Drizzle迁移文件并执行,确保约束同步到数据库;若已有不符合约束的数据,需先清理或修正,否则迁移会失败。

内容的提问来源于stack exchange,提问作者Laura Gorski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:03:23