postgresql 在postgres /mysql中,我可以基于json字段定义唯一索引吗?

rqenqsqc  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

如果使用postgres 14 /mysql 8服务器,我可以基于json字段定义唯一索引吗?
下一次迁移:

Schema::create('quiz_categories', function (Blueprint $table) {
    $table->id();
    $table->json('name')->comment('This column is used for i18n support');
    $table->boolean('active')->default(false);
    $table->timestamps();

    $table->unique(['name', 'active'], 'quiz_categories_name_active_index');
});

字符串
我得到错误:

Illuminate\Database\QueryException 

  SQLSTATE[42704]: Undefined object: 7 ERROR:  data type json has no default operator class for access method "btree"
HINT:  You must specify an operator class for the index or define a default operator class for the data type. (Connection: pgsql, SQL: alter table "quiz_categories" add constraint "quiz_categories_name_active_index" unique ("name", "active"))


wqlqzqxt

wqlqzqxt1#

你可以在PostgreSQL中对JSON字段建立一个唯一的索引,但是需要一些额外的步骤。PostgreSQL没有为JSON数据类型的“btree”访问方法提供默认的操作符类。但是jsonb为“btree”访问函数提供了一个默认的操作符类,所以你可以用它来代替json,在JSON字段上创建一个唯一的索引。这是如何改变你的迁移来使用jsonb。

Schema::create('quiz_categories', function (Blueprint $table) {
    $table->id();
    $table->jsonb('name')->comment('This column is used for i18n support');
    $table->boolean('active')->default(false);
    $table->timestamps();

    $table->unique(['name', 'active'], 'quiz_categories_name_active_index');
});

字符串
希望能成功:)

相关问题