XORM中索引需通过结构体xorm标签显式声明:普通索引用index或index(名称),唯一索引用unique;联合索引和联合唯一索引不支持自动创建,须手动执行SQL。

要在XORM框架中为数据库字段建立普通索引或唯一索引,必须通过结构体字段的xorm标签显式声明,否则AutoSync或Sync执行时不会生成对应索引。
在结构体字段上声明普通索引
普通索引用于加速查询,不约束数据唯一性。只需在字段tag中添加index即可。
方法一:单列普通索引
在目标字段后添加xorm:"index",例如:
Username string `xorm:"varchar(50) index"`
方法二:带名称的普通索引(便于后期维护和排查)
使用xorm:"index(idx_username)"格式,括号内为自定义索引名,如:
Email string `xorm:"varchar(100) index(idx_email)"`
这会生成名为idx_email的B-tree普通索引,MySQL中默认生效。
注意:多个字段共用同一索引名(如都写index(idx_user_meta))不会自动组成复合索引——XORM不按索引名聚合字段,复合索引需靠数据库原生SQL或手动建表完成。
在结构体字段上声明唯一索引
唯一索引既能提速又能防止重复值写入,是保障业务数据一致性的关键手段。
第一步:单列唯一索引
直接在字段tag中加入unique,例如:
Phone string `xorm:"varchar(20) unique"`
这会在phone列上创建唯一约束,等效于MySQL的UNIQUE KEY uk_phone (phone)。
第二步:多列联合唯一索引
XORM本身不支持通过结构体tag声明多列唯一约束。即使你给两个字段都加unique,也会各自建单列唯一索引,而非联合唯一索引。
第三步:绕过限制的可行方案
必须在建表后,用engine.Exec("ALTER TABLE users ADD UNIQUE INDEX uk_user_role (user_id, role_id)")手动执行SQL。XORM的Sync和AutoSync均无法识别多字段联合唯一语义。
方法三:用not null + unique组合强化校验
例如:IDCard string `xorm:"varchar(18) notnull unique"`,既禁止空值又保证全局唯一,适合身份证号类强唯一字段。











