在MarsCode里写数据库建表提示词,千万别只写“建个用户表”这么简单。直接给出完整的API文档JSON示例,让系统自动生成PostgreSQL 15.4的建表语句——主键用UUIDv4,文本字段默认NOT NULL,时间字段映射成timestamptz,金额强制DECIMAL(12,2),再加上规范命名的显式索引和pg_stat_statements注释。

如果你经常在MarsCode里生成建表SQL,应该遇到过这种情况:提示词写得太随意,出来的DDL要么缺主键,要么时间字段用了datetime而不是timestamptz,甚至把tinyint当布尔用。这些看似不起眼的细节,一旦漏掉,上线后很可能引发数据错乱或查询性能雪崩。
用接口契约反推字段定义
几个关键点,能帮你一次就生成可落地的DDL。先从接口契约反推字段定义开始。打开你正在对接的API文档,找到POST /api/v1/users的请求体示例,把整个JSON对象(包括嵌套结构)完整复制下来,直接粘贴到MarsCode搜索框的开头位置。
这里有个容易忽略的细节:不能只复制字段名列表,保留原始JSON的层级、空值标记和示例值至关重要。比如下面这个例子:
{
"id": "usr_8a2f3c",
"status": null,
"created_at": "2026-07-02T09:15:22.123Z"
}
MarsCode会根据null值判断该字段是否允许为空,根据ISO 8601时间格式自动选用timestamptz而不是datetime。这一步做好之后,在JSON后面另起一行,写上:“按PostgreSQL 15.4语法生成CREATE TABLE语句,主键用UUIDv4,所有文本字段加NOT NULL约束,除非原始JSON中明确标为null。”
按业务动作锁定约束条件
方法一:状态流转驱动约束
以用户注册到账号注销这条典型链路为例:用户注册->邮箱验证->实名认证->开通付费->账号注销。这个过程中,每个状态变更都代表一个不可逆的操作。那么,user_status字段应该设计成有序ENUM,枚举值严格限定为:'registered', 'verified', 'certified', 'paid', 'deactivated'。同时,必须添加CHECK约束,确保状态只能从左向右单向推进,禁止跳过任何中间状态,比如从verified直接跳到paid。
方法二:金额字段强制精度锚定
所有金额类字段,比如price、discount、total,必须强制使用DECIMAL(12,2),绝对不能出现FLOAT或DOUBLE类型。小数点后固定两位,不允许出现.00以外的精度,比如199.999在入库时会被直接截断报错。这一点是硬性要求,用FLOAT类型很容易导致支付对账出现0.01元的偏差。
索引与性能兜底策略
第一步:识别高频查询路径
① 如果每次查询用户时都带着WHERE tenant_id = ? AND status = ?,那就在tenant_id和status上建立复合索引;
② 经常按创建时间倒序查询最近100条记录?在created_at字段上建降序索引;
③ 搜索用户名需要支持模糊匹配?考虑在username字段上建GIN索引,配合trigram扩展。
第二步:禁用危险默认
不生成任何B-tree单列索引;所有索引名必须以idx_开头加字段名缩写(比如idx_tnt_sts);禁止为外键字段自动添加索引——只有显式声明时才创建。
第三步:写入性能保护
每张表默认添加pg_stat_statements兼容注释,格式类似:/* pg_stat_statements: user_search_by_email */,便于后续快速定位慢查询源头。
