동일한 테이블에서 업데이트를 수행한 다음 INSERT를 수행하기 위한 MariaDB 트리거
는 현재 ★★★★★★★★★를 가지고 있습니다.account과 블블 tableaccount_audit테이블(여기에서는 모든 코드를 바이올린으로 사용할 수 있습니다).
계정 테이블에 삽입된 데이터에 따라 레코드를 account_audit 테이블에 삽입하는 트리거가 2개 있습니다.
1 트리거는 이러한 값을 삽입하기만 하는 ON INSERT 트리거로, 정상적으로 작동합니다.
그래서 감사테이블에 2개의 레코드를 삽입한 후 아래와 같이 양테이블에 2개의 레코드가 있습니다.
SELECT * FROM account;
주다
acct_id acct_name acct_balance tax_rate acct_opened
1 Bill 100.00 0.10 2019-11-01
2 Ben 1000.00 0.10 2019-11-01
그리고.
SELECT * FROM account_audit;
주다
acct_id txn_id acct_name acct_balance tax_rate valid_from valid_to
1 1 Bill 100.00 0.10 2021-11-07 2038-01-19
2 2 Ben 1000.00 0.10 2021-11-07 2038-01-19
2038은 MariaDB 무한대입니다. 적어도 시간 테이블에서는요!
단, UPDATE 트리거는 다음과 같습니다.
CREATE TRIGGER testtrigger_upd
AFTER UPDATE ON account
FOR EACH ROW BEGIN
UPDATE account_audit SET valid_to = NOW()
WHERE ((valid_to = '2038-01-19') AND (OLD.acct_name = NEW.acct_name));
INSERT INTO
account_audit (acct_id, acct_name, acct_balance, tax_rate)
VALUES
(
OLD.acct_id,
OLD.acct_name,
NEW.acct_balance,
OLD.tax_rate
-- valid_from - NOW()!
-- valid_to DEFAULTs to '2038-01-19' which is what we want for updates to balance
);
END;
때) 를 account_audit trail로 .valid_to 및 새로운 (the records)에 대해서valid_fromvalid_to2038년(MariaDB)의무도도의 。
문제는 이 명령어를 실행하면
UPDATE account
SET acct_balance = acct_balance + 50 WHERE acct_name = 'Bill'; -- name is UNIQUE
account_displays 테이블 내의 레코드는 다음과 같습니다.
acct_id txn_id acct_name acct_balance tax_rate valid_from valid_to
1 1 Bill 100.00 0.10 2021-11-07 2021-11-07
1 3 Bill 150.00 0.10 2021-11-07 2038-01-19
2 2 Ben 1000.00 0.10 2021-11-07 2021-11-07
Bill의 레코드가 삽입된 것을 알 수 있지만, 문제는 Ben의 레코드도 오늘 삽입일로 갱신되었다는 것입니다.Bill에게만 분명히 이런 일이 일어나기를 바랍니다!
있다WHERE ((valid_to = '2038-01-19') AND (OLD.acct_name = NEW.acct_name));다른 많은 시도도 해봤지만WHERE OLD.acct_id = NEW.acct_id그리고 이름 대신 acct_id를 사용하도록 업데이트를 변경해보았습니다.이치노이전 주문과 새 주문을 바꾸려고 합니다. - 업데이트 전 또는 업데이트 후 주문 - 정말 당황스럽습니다!
account_audit 테이블을 갱신하는 트리거는 어떻게 하면 모든 계정이 아닌 자신의 계정만 갱신할 수 있습니까?즉, Bill 계정만 갱신하고 Ben 계정만 갱신할 수 있습니까?
시간 테이블 기능에 대해 알고 있습니다. 스터디용이고 트리거를 사용해야 하므로 이 기능을 사용하고 싶지 않습니다.
바이올린이 왔어요.
모든 행에 대해 your where 절이 true이기 때문입니다.
따라서 테이블에서 확인할 업데이트 쿼리를 변경합니다.
CREATE TRIGGER testtrigger_upd AFTER UPDATE ON account FOR EACH ROW BEGIN UPDATE account_audit SET valid_to = NOW() WHERE ((valid_to = '2038-01-19') AND (acct_name = NEW.acct_name)); INSERT INTO account_audit (acct_id, acct_name, acct_balance, tax_rate) VALUES ( OLD.acct_id, OLD.acct_name, NEW.acct_balance, OLD.tax_rate -- valid_from - NOW()! -- valid_to DEFAULTs to '2038-01-19' which is what we want for updates to balance ); END;
UPDATE account SET acct_balance = acct_balance + 50 WHERE acct_name = 'Bill';
SELECT * FROM account_auditacct_id | txn_id | acct_name | acct_balance | tax_rate | valid_from | valid_to------: | -----: | :-------- | -----------: | -------: | :--------- | :---------1 | 1 | 과금 | 100.00 | 0 | 2021-11-07 | 2021-11-072 | 2 | Ben | 1000.00 | 0 | 2021-11-07 | 2038-01-191 | null | 과금 | 150.00 | 0 | null | null
db <>여기에 추가
내가 보기엔 'where' 조항은
WHERE ((valid_to = '2038-01-19') AND (OLD.acct_name = NEW.acct_name));
Ben과 Bill 모두에게 유효합니다.따라서 둘 다 업데이트가 됩니다.
해결책은 다음과 같이 약간 변경하는 것입니다.
WHERE ((valid_to = '2038-01-19') AND (acct_name = OLD.acct_name));
언급URL : https://stackoverflow.com/questions/69874080/mariadb-trigger-to-perform-an-update-and-then-an-insert-on-the-same-table
'source' 카테고리의 다른 글
| 라라벨 웅변 모델의 세 테이블 결합 방법 (0) | 2022.12.03 |
|---|---|
| 데이터베이스에서 상태 열의 내용을 제목으로 표시하는 방법 (0) | 2022.12.03 |
| jsonpath를 사용하여 멤버 수를 어떻게 계산합니까? (0) | 2022.12.03 |
| 예외에 정보를 추가하시겠습니까? (0) | 2022.12.03 |
| OS X의 sem_init (0) | 2022.11.24 |