Spring Boot+PostgreSQL实现非空列唯一、允许多空值(Liquibase YAML)
需求可行性与实现方案
这个需求完全可行,PostgreSQL原生支持非空值唯一、允许多个空值的约束场景,有两种实现方式可选:
方式一:普通唯一约束(简洁实现)
PostgreSQL的普通唯一约束本身就允许同一列存在多个NULL值(SQL标准中NULL不等于任何值,包括另一个NULL),非空值会被自动强制唯一。用这种方式的Liquibase YAML写法如下:
新增列时添加约束
- changeSet: id: create-table-with-unique-label author: your-name changes: - createTable: tableName: your_table columns: - column: name: id type: bigint autoIncrement: true constraints: primaryKey: true nullable: false - column: name: label type: varchar(150) constraints: unique: true
给现有列添加约束
- changeSet: id: add-unique-constraint-to-label author: your-name changes: - addUniqueConstraint: columnNames: label constraintName: uq_your_table_label tableName: your_table
方式二:部分唯一索引(语义更明确)
如果想要更清晰地表达“仅非空值需唯一”的语义,可以使用PostgreSQL的部分唯一索引,通过WHERE条件限定只对非空值生效。Liquibase写法如下:
新增列后创建部分唯一索引
- changeSet: id: create-table-and-partial-index author: your-name changes: - createTable: tableName: your_table columns: - column: name: id type: bigint autoIncrement: true constraints: primaryKey: true nullable: false - column: name: label type: varchar(150) - createIndex: indexName: idx_unique_label_non_null tableName: your_table columns: - column: name: label unique: true where: "label IS NOT NULL"
给现有列添加部分唯一索引
- changeSet: id: add-partial-unique-index author: your-name changes: - createIndex: indexName: idx_unique_label_non_null tableName: your_table columns: - column: name: label unique: true where: "label IS NOT NULL"
关于你提供的YAML写法说明
你写的unique: true if not null是无效语法,Liquibase不支持这种条件式的约束声明,必须使用上面两种标准写法来实现需求。
内容的提问来源于stack exchange,提问作者Ivan Karotki
相关产品推荐
相关产品推荐

