5.创建一个供应历史表hspj(sno,pno,jno,qty,username,modifydate),记录供应变化情况。实现这样的约束控制:如果spj表中的某条供应记录发生改变,就在hspj表中插入一行历史记录,其中username为操作的用户名,modifydate为操作的时间。
时间: 2023-12-14 15:36:35 浏览: 115
可以使用触发器实现约束控制,具体步骤如下:
1. 创建hspj表,包含sno、pno、jno、qty、username、modifydate等字段。
2. 创建触发器,在spj表中添加、删除、更新记录时自动触发,触发器中插入对应的历史记录到hspj表中。
触发器代码如下:
```sql
CREATE TRIGGER tr_spj_change
AFTER INSERT OR UPDATE OR DELETE ON spj
FOR EACH ROW
BEGIN
IF (OLD.qty != NEW.qty OR OLD.sno != NEW.sno OR OLD.pno != NEW.pno OR OLD.jno != NEW.jno) THEN
INSERT INTO hspj(sno, pno, jno, qty, username, modifydate)
VALUES(OLD.sno, OLD.pno, OLD.jno, OLD.qty, USER(), NOW());
END IF;
END;
```
以上代码中,触发器在每次spj表中添加、更新、删除记录时自动触发。如果旧记录和新记录之间存在变化,则插入对应的历史记录到hspj表中。其中,USER()函数返回当前用户的用户名,NOW()函数返回当前时间。
相关问题
5.创建一个供应历史表HSPJ(SNO,PNO,JNO,QTY,username,modifydate),记录供应变化情况。实现这样的约束控制:如果spj表中的某条供应记录发生改变,就在hspj表中插入一行历史记录,其中username为操作的用户名,modifydate为操作的时间。在mysql8下执行
在 MySQL 8 下执行以下 SQL 语句可以创建供应历史表 HSPJ,并实现所述的约束控制:
```sql
CREATE TABLE HSPJ (
SNO VARCHAR(10),
PNO VARCHAR(10),
JNO VARCHAR(10),
QTY INT,
username VARCHAR(50),
modifydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
DELIMITER //
CREATE TRIGGER tr_hspj_insert
AFTER INSERT ON SPJ
FOR EACH ROW
BEGIN
INSERT INTO HSPJ (SNO, PNO, JNO, QTY, username)
VALUES (NEW.SNO, NEW.PNO, NEW.JNO, NEW.QTY, USER());
END//
CREATE TRIGGER tr_hspj_update
AFTER UPDATE ON SPJ
FOR EACH ROW
BEGIN
IF NOT (OLD.SNO <=> NEW.SNO AND OLD.PNO <=> NEW.PNO AND OLD.JNO <=> NEW.JNO AND OLD.QTY <=> NEW.QTY) THEN
INSERT INTO HSPJ (SNO, PNO, JNO, QTY, username)
VALUES (NEW.SNO, NEW.PNO, NEW.JNO, NEW.QTY, USER());
END IF;
END//
DELIMITER ;
```
上述 SQL 语句中,它创建了一个名为 HSPJ 的表,包含 SNO、PNO、JNO、QTY、username 和 modifydate 六个字段,其中 modifydate 的默认值是当前时间戳,表示最后修改时间。它还创建了两个触发器:
1. tr_hspj_insert:在 SPJ 表中插入新记录时,自动将相应的供应历史记录插入到 HSPJ 表中,其中 username 为当前用户。
2. tr_hspj_update:在 SPJ 表中更新记录时,如果 SNO、PNO、JNO 或 QTY 发生变化,则自动将相应的供应历史记录插入到 HSPJ 表中,其中 username 为当前用户。
这样,每次对 SPJ 表进行插入或更新操作时,就能够自动记录相应的供应历史信息。
阅读全文