-- ============================================================ -- migrations_add_purchase_stockbuy_link.sql -- 打通「采购申请」与「采购入库」的按单入库链路 -- -- 变更内容: -- 1. purchase_request 表新增 base_id 列(FK → material_base.id) -- 2. stock_buy 表新增 request_id 列(FK → purchase_request.id) -- -- 执行方式(任选一种): -- psql -h -U postgres -d inventory_system -f migrations_add_purchase_stockbuy_link.sql -- 或在 pgAdmin / Navicat / DBeaver 中打开执行 -- ============================================================ BEGIN; -- ============================================================ -- 1. purchase_request 新增 base_id -- 硬关联基础物料表,使采购申请能精确锁定物料 -- ============================================================ ALTER TABLE purchase_request ADD COLUMN IF NOT EXISTS base_id INTEGER; -- 添加外键约束(如果列已存在但无约束,会补充) DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'fk_purchase_request_base_id' AND table_name = 'purchase_request' ) THEN ALTER TABLE purchase_request ADD CONSTRAINT fk_purchase_request_base_id FOREIGN KEY (base_id) REFERENCES material_base(id) ON DELETE SET NULL; END IF; END; $$; -- 为 base_id 添加索引(支持按物料筛选采购申请) CREATE INDEX IF NOT EXISTS ix_purchase_request_base_id ON purchase_request (base_id); COMMENT ON COLUMN purchase_request.base_id IS '关联基础物料ID'; -- ============================================================ -- 2. stock_buy 新增 request_id -- 关联采购申请单,使入库记录可追溯到来源采购单 -- ============================================================ ALTER TABLE stock_buy ADD COLUMN IF NOT EXISTS request_id INTEGER; -- 添加外键约束 DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'fk_stock_buy_request_id' AND table_name = 'stock_buy' ) THEN ALTER TABLE stock_buy ADD CONSTRAINT fk_stock_buy_request_id FOREIGN KEY (request_id) REFERENCES purchase_request(id) ON DELETE SET NULL; END IF; END; $$; -- 为 request_id 添加索引(支持"按单查入库"的追溯查询) CREATE INDEX IF NOT EXISTS ix_stock_buy_request_id ON stock_buy (request_id); COMMENT ON COLUMN stock_buy.request_id IS '关联采购申请单ID'; -- ============================================================ -- 3. 验证结果 -- ============================================================ SELECT column_name, data_type, is_nullable, pg_catalog.col_description( (SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relname = table_name), ordinal_position ) AS comment FROM information_schema.columns WHERE table_name IN ('purchase_request', 'stock_buy') AND column_name IN ('base_id', 'request_id') ORDER BY table_name, column_name; COMMIT;