-- CreateEnum CREATE TYPE "DictStatus" AS ENUM ('ACTIVE', 'DISABLED'); -- CreateEnum CREATE TYPE "DictKind" AS ENUM ('TREE', 'LIST'); -- CreateTable CREATE TABLE "system_config_versions" ( "id" CHAR(26) NOT NULL, "config_key" VARCHAR(128) NOT NULL, "version" INTEGER NOT NULL, "old_value" JSONB, "new_value" JSONB NOT NULL, "reason" VARCHAR(255), "changed_by" CHAR(26), "changed_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "system_config_versions_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "dict_types" ( "id" CHAR(26) NOT NULL, "code" VARCHAR(64) NOT NULL, "name" VARCHAR(64) NOT NULL, "group_key" VARCHAR(32) NOT NULL, "kind" "DictKind" NOT NULL DEFAULT 'LIST', "description" VARCHAR(255) NOT NULL DEFAULT '', "industry_scoped" BOOLEAN NOT NULL DEFAULT false, "builtin" BOOLEAN NOT NULL DEFAULT false, "status" "DictStatus" NOT NULL DEFAULT 'ACTIVE', "sort_order" INTEGER NOT NULL DEFAULT 0, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, "updated_by" VARCHAR(64), CONSTRAINT "dict_types_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "dict_items" ( "id" CHAR(26) NOT NULL, "type_id" CHAR(26) NOT NULL, "code" VARCHAR(64) NOT NULL, "name" VARCHAR(64) NOT NULL, "parent_code" VARCHAR(64), "industry_id" CHAR(26), "sort_order" INTEGER NOT NULL DEFAULT 0, "status" "DictStatus" NOT NULL DEFAULT 'ACTIVE', "remark" VARCHAR(255) NOT NULL DEFAULT '', "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, "updated_by" VARCHAR(64), CONSTRAINT "dict_items_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE INDEX "system_config_versions_changed_at_idx" ON "system_config_versions"("changed_at"); -- CreateIndex CREATE UNIQUE INDEX "system_config_versions_config_key_version_key" ON "system_config_versions"("config_key", "version"); -- CreateIndex CREATE UNIQUE INDEX "dict_types_code_key" ON "dict_types"("code"); -- CreateIndex CREATE INDEX "dict_types_group_key_sort_order_idx" ON "dict_types"("group_key", "sort_order"); -- CreateIndex CREATE INDEX "dict_items_type_id_industry_id_sort_order_idx" ON "dict_items"("type_id", "industry_id", "sort_order"); -- CreateIndex CREATE INDEX "dict_items_type_id_parent_code_idx" ON "dict_items"("type_id", "parent_code"); -- AddForeignKey ALTER TABLE "system_config_versions" ADD CONSTRAINT "system_config_versions_config_key_fkey" FOREIGN KEY ("config_key") REFERENCES "system_configs"("config_key") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "dict_items" ADD CONSTRAINT "dict_items_type_id_fkey" FOREIGN KEY ("type_id") REFERENCES "dict_types"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "dict_items" ADD CONSTRAINT "dict_items_industry_id_fkey" FOREIGN KEY ("industry_id") REFERENCES "industries"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- A4 / R-10:同 type + code + 行业层唯一;industry_id 为 NULL 的通用层也必须唯一 CREATE UNIQUE INDEX "dict_items_type_code_generic_key" ON "dict_items"("type_id", "code") WHERE "industry_id" IS NULL; CREATE UNIQUE INDEX "dict_items_type_code_industry_key" ON "dict_items"("type_id", "code", "industry_id") WHERE "industry_id" IS NOT NULL; -- 一条条目不能把自己作为父级 ALTER TABLE "dict_items" ADD CONSTRAINT "dict_items_no_self_parent_check" CHECK ("parent_code" IS NULL OR "parent_code" <> "code");