您必须根据自己的情况进行调整,但在我的情况下,我有一个费用类型的查找表,这就是我将费用更新为新价格并保留原始价格以供参考的方式。此处视图的开销仅与您查询它以生成发票的频率有关。这是我的用例。
您可以在此处使用 vwCharge 获取最新定价列表。当使用 update_charge_rate() 时,它会添加一个新的更新日期,查询 vwCharge 只会显示最近的。
分隔符设置为 //
查找表:
CREATE TABLE lkCharge (
charge_id SMALLINT NOT NULL AUTO_INCREMENT,
charge_datecreated DATE NOT NULL,
charge_name VARCHAR(20) NOT NULL,
charge_rate DECIMAL(10,2) NOT NULL,
charge_islocked CHAR(1) DEFAULT 'N',
charge_lockedby VARCHAR(255) DEFAULT NULL,
charge_lockdate TIMESTAMP NULL,
charge_isdeleted CHAR(1) DEFAULT 'N',
CONSTRAINT pkChargeId PRIMARY KEY(charge_id, charge_datecreated)
) ENGINE=InnoDB DEFAULT CHARSET=utf8//
风景:
CREATE VIEW vwCharge AS
SELECT
charge_id,
charge_datecreated,
charge_name,
charge_rate,
charge_islocked,
charge_lockedby,
charge_lockdate,
charge_isdeleted
FROM lkCharge AS o
WHERE o.charge_id=o.charge_id AND charge_datecreated=(
SELECT MAX(charge_datecreated)
FROM lkCharge AS i
WHERE i.charge_id=o.charge_id
)//
更新程序:
CREATE PROCEDURE update_charge_rate(
IN p_charge_id SMALLINT,
IN p_new_charge_rate DECIMAL(10,2)
)
BEGIN
DECLARE _name VARCHAR(20);
SELECT charge_name INTO _name
FROM vwCharge WHERE charge_id=p_charge_id;
INSERT INTO lkCharge(charge_id, charge_datecreated, charge_name, charge_rate)
VALUES(p_charge_id, UTC_DATE(), _name, p_new_charge_rate);
SELECT LAST_INSERT_ID();
END//