Backup local changes before resolving remote repository issue

This commit is contained in:
2026-01-27 10:05:25 +08:00
parent 11c2758289
commit 86bca03b04
29 changed files with 2626 additions and 126 deletions

85
sql/fix_audit_fields.sql Normal file
View File

@@ -0,0 +1,85 @@
-- 数据库审计字段修复脚本
-- 用于确保所有表都能正确处理 create_by 和 create_time 字段
-- 步骤 1: 检查哪些表有审计字段但没有正确设置
-- 查询所有包含审计字段的表及其约束状态
SELECT
table_name,
column_name,
is_nullable,
column_default
FROM
information_schema.columns
WHERE
table_schema = 'public'
AND column_name IN ('create_by', 'create_time', 'update_by', 'update_time')
AND is_nullable = 'NO' -- 表示有NOT NULL约束
ORDER BY
table_name, column_name;
-- 步骤 2: 为所有审计字段设置合理的默认值(可选)
-- 这样即使自动填充失败,也不会违反约束
ALTER TABLE "public"."adm_practitioner" ALTER COLUMN "create_by" SET DEFAULT 'system';
ALTER TABLE "public"."adm_practitioner" ALTER COLUMN "update_by" SET DEFAULT 'system';
-- 步骤 3: 检查并更新现有数据确保没有NULL值
-- 对于create_by字段
UPDATE "public"."adm_practitioner"
SET "create_by" = 'system'
WHERE "create_by" IS NULL OR "create_by" = '';
-- 对于update_by字段
UPDATE "public"."adm_practitioner"
SET "update_by" = 'system'
WHERE "update_by" IS NULL;
-- 步骤 4: 为其他可能存在相同问题的表执行类似操作
-- 以下是根据数据库结构推测的一些表名,您可能需要根据实际情况调整
DO $$
DECLARE
table_name text;
tables_with_audit_fields CURSOR FOR
SELECT DISTINCT t.table_name
FROM information_schema.tables t
JOIN information_schema.columns c ON t.table_name = c.table_name
WHERE t.table_schema = 'public'
AND c.column_name IN ('create_by', 'create_time', 'update_by', 'update_time')
AND c.is_nullable = 'NO';
BEGIN
FOR rec IN tables_with_audit_fields LOOP
BEGIN
-- 为每个表设置审计字段的默认值
EXECUTE format('ALTER TABLE "public"."%I" ALTER COLUMN "create_by" SET DEFAULT ''system''', rec.table_name);
EXECUTE format('ALTER TABLE "public"."%I" ALTER COLUMN "update_by" SET DEFAULT ''system''', rec.table_name);
-- 更新现有的NULL值
EXECUTE format('UPDATE "public"."%I" SET "create_by" = ''system'' WHERE "create_by" IS NULL OR "create_by" = ''''', rec.table_name);
EXECUTE format('UPDATE "public"."%I" SET "update_by" = ''system'' WHERE "update_by" IS NULL', rec.table_name);
RAISE NOTICE 'Processed table: %', rec.table_name;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Could not process table: %, Error: %', rec.table_name, SQLERRM;
END;
END LOOP;
END $$;
-- 步骤 5: 验证修复结果
-- 检查是否还有表存在审计字段的NULL值
SELECT
table_name,
column_name,
COUNT(*) as null_count
FROM (
SELECT 'adm_practitioner' as table_name, 'create_by' as column_name, create_by FROM "public"."adm_practitioner" WHERE create_by IS NULL
UNION ALL
SELECT 'adm_practitioner' as table_name, 'update_by' as column_name, update_by FROM "public"."adm_practitioner" WHERE update_by IS NULL
-- 在这里添加其他表的检查
) t
GROUP BY table_name, column_name;
-- 注意事项:
-- 1. 在生产环境执行前务必备份数据库
-- 2. 根据实际业务需求调整默认值(例如使用实际的用户名而非'system'
-- 3. 确保应用程序层面的自动填充机制正常工作
-- 4. 考虑在应用程序启动时进行审计字段的完整性检查

View File

@@ -0,0 +1,35 @@
-- 移除 adm_practitioner 表中 create_by 列的 NOT NULL 约束
-- 用于解决 org.postgresql.util.PSQLException: ERROR: null value in column "create_by" of relation "adm_practitioner" violates not-null constraint
-- 在PostgreSQL中NOT NULL约束实际上是列的一个属性而不是命名约束
-- 因此我们使用 ALTER COLUMN ... DROP NOT NULL 来移除它
-- 可选:先查看当前表结构及约束信息
-- 注意:\d 命令仅在 psql 中有效,在脚本中不能使用
/*
SELECT
c.column_name,
c.is_nullable,
c.data_type,
tc.constraint_type
FROM
information_schema.columns c
LEFT JOIN
information_schema.constraint_column_usage ccu ON c.column_name = ccu.column_name AND c.table_name = ccu.table_name
LEFT JOIN
information_schema.table_constraints tc ON ccu.constraint_name = tc.constraint_name
WHERE
c.table_name = 'adm_practitioner'
AND c.column_name = 'create_by';
*/
-- 移除 create_by 列的 NOT NULL 约束
ALTER TABLE "public"."adm_practitioner"
ALTER COLUMN "create_by" DROP NOT NULL;
-- 可选:如果需要,可以同时移除默认值
-- ALTER TABLE "public"."adm_practitioner"
-- ALTER COLUMN "create_by" DROP DEFAULT;
-- 提示执行此脚本后create_by 列将允许 NULL 值
-- 这将解决插入数据时因缺少 create_by 值而导致的违反非空约束错误

View File

@@ -0,0 +1,58 @@
-- 安全移除 adm_practitioner 表中 create_by 列的 NOT NULL 约束
-- 用于解决 org.postgresql.util.PSQLException: ERROR: null value in column "create_by" of relation "adm_practitioner" violates not-null constraint
-- 步骤 1: 检查当前表结构
-- 查看 create_by 列的当前约束情况
SELECT
column_name,
is_nullable,
data_type,
column_default
FROM
information_schema.columns
WHERE
table_schema = 'public'
AND table_name = 'adm_practitioner'
AND column_name = 'create_by';
-- 步骤 2: 备份重要数据(可选但推荐)
-- 创建一个临时表来保存当前数据概览
CREATE TEMPORARY TABLE adm_practitioner_backup_check AS
SELECT id, name, create_by, create_time
FROM public.adm_practitioner
LIMIT 10; -- 只取前10条记录作为样本检查
-- 显示备份样本以供参考
SELECT * FROM adm_practitioner_backup_check;
-- 步骤 3: 执行约束移除操作
-- 在PostgreSQL中NOT NULL约束实际上是列的一个属性而不是命名约束
-- 使用 ALTER COLUMN ... DROP NOT NULL 来移除它
ALTER TABLE "public"."adm_practitioner"
ALTER COLUMN "create_by" DROP NOT NULL;
-- 步骤 4: 验证更改
-- 再次检查列属性确认NOT NULL约束已被移除
SELECT
column_name,
is_nullable,
data_type,
column_default
FROM
information_schema.columns
WHERE
table_schema = 'public'
AND table_name = 'adm_practitioner'
AND column_name = 'create_by';
-- 步骤 5: 测试插入操作(可选)
-- 尝试插入一条不带create_by值的数据来验证约束是否已移除
-- 注意:实际执行时请根据需要调整其他必需字段
-- INSERT INTO "public"."adm_practitioner" (name, user_id, tenant_id, delete_flag, create_time)
-- VALUES ('Test Practitioner', 0, 1, '0', NOW());
-- 提示:
-- 1. 执行此脚本前建议先备份整个表或数据库
-- 2. 执行后 create_by 列将允许 NULL 值
-- 3. 这将解决插入数据时因缺少 create_by 值而导致的违反非空约束错误
-- 4. 考虑在应用程序层面处理可能的 NULL 值