MySql 오류:저장된 함수/트리거를 호출한 문에서 이미 사용되고 있으므로 저장된 함수/트리거의 테이블을 업데이트할 수 없습니다.
MySQL 쿼리를 실행하고 있습니다.그러나 폼 입력에서 새 행을 추가하면 다음 오류가 발생합니다.
Error: Can't update table 'brandnames' in stored function/trigger because it is
already used by statement which invoked this stored function/trigger.
코드부터:
CREATE TRIGGER `capital` AFTER INSERT ON `brandnames`
FOR EACH
ROW UPDATE brandnames
SET bname = CONCAT( UCASE( LEFT( bname, 1 ) ) , LCASE( SUBSTRING( bname, 2 ) ) )
이 오류는 무엇을 의미합니까?
테이블은 변경할 수 없습니다.INSERT
트리거가 기동하고 있습니다.그INSERT
가 잠금을 실행하여 교착 상태가 될 수 있습니다.또한 트리거에서 테이블을 업데이트하면 무한 재귀 루프에서 동일한 트리거가 다시 발생합니다.이 두 가지 이유 모두 MySQL에서 이 작업을 수행할 수 없는 이유입니다.
다만, 무엇을 달성하려고 하는가에 따라서는, 다음의 방법으로 새로운 값에 액세스 할 수 있습니다.NEW.fieldname
또는 오래된 가치관(예를 들어, 를 사용하는 경우)도OLD
.
라고 하는 이름의 행이 있는 경우full_brand_name
그리고 현장에서 처음 두 글자를 짧은 이름으로 사용하길 원하셨죠small_name
다음을 사용할 수 있습니다.
CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
FOR EACH ROW BEGIN
SET NEW.short_name = CONCAT(UCASE(LEFT(NEW.full_name,1)) , LCASE(SUBSTRING(NEW.full_name,2)))
END
올바른 구문은 다음과 같습니다.
FOR EACH ROW SET NEW.bname = CONCAT( UCASE( LEFT( NEW.bname, 1 ) )
, LCASE( SUBSTRING( NEW.bname, 2 ) ) )
"Before-INSERT" 트리거는 삽입물에 동일한 테이블 업데이트를 구현하는 유일한 방법이며 MySQL 5.5+에서만 가능합니다.그러나 자동 증분 필드의 값은 "AFTER-INSERT" 트리거에서만 사용할 수 있습니다. BEFORE-CASE의 경우 기본값은 0입니다.따라서 다음 코드 예에서는 자동 증분 값에 따라 이전에 계산된 대리 키 값을 설정합니다.id
는 컴파일되지만 NEW.id은 항상0 이므로 실제로는 동작하지 않습니다.
create table products(id int not null auto_increment, surrogatekey varchar(10), description text);
create trigger trgProductSurrogatekey before insert on product
for each row set NEW.surrogatekey =
(select surrogatekey from surrogatekeys where id = NEW.id);
동일한 문제가 발생하여 필드를 업데이트하기 전에 "new"를 추가하여 해결합니다.그리고 여기에 방아쇠를 당기는 글을 올렸습니다 누군가 방아쇠를 당길 사람은
DELIMITER $$
USE `nc`$$
CREATE
TRIGGER `nhachung_province_count_update` BEFORE UPDATE ON `nhachung`
FOR EACH ROW BEGIN
DECLARE slug_province VARCHAR(128);
DECLARE slug_district VARCHAR(128);
IF old.status!=new.status THEN /* neu doi status */
IF new.status="Y" THEN
UPDATE province SET `count`=`count`+1 WHERE id = new.district_id;
ELSE
UPDATE province SET `count`=`count`-1 WHERE id = new.district_id;
END IF;
ELSEIF old.province_id!=new.province_id THEN /* neu doi province_id + district_id */
UPDATE province SET `count`=`count`+1 WHERE id = new.province_id; /* province_id */
UPDATE province SET `count`=`count`-1 WHERE id = old.province_id;
UPDATE province SET `count`=`count`+1 WHERE id = new.district_id; /* district_id */
UPDATE province SET `count`=`count`-1 WHERE id = old.district_id;
SET slug_province = ( SELECT slug FROM province WHERE id= new.province_id LIMIT 0,1 );
SET slug_district = ( SELECT slug FROM province WHERE id= new.district_id LIMIT 0,1 );
SET new.prov_dist_url=CONCAT(slug_province, "/", slug_district);
ELSEIF old.district_id!=new.district_id THEN
UPDATE province SET `count`=`count`+1 WHERE id = new.district_id;
UPDATE province SET `count`=`count`-1 WHERE id = old.district_id;
SET slug_province = ( SELECT slug FROM province WHERE id= new.province_id LIMIT 0,1 );
SET slug_district = ( SELECT slug FROM province WHERE id= new.district_id LIMIT 0,1 );
SET new.prov_dist_url=CONCAT(slug_province, "/", slug_district);
END IF;
END;
$$
DELIMITER ;
이게 도움이 됐으면 좋겠는데
@gerrit_hoekstra: "단, 자동 증분 필드의 값은 "AFTER-INSERT" 트리거에서만 사용할 수 있습니다. BEFORE-Case에서는 기본값이 0입니다."
정답이지만 후속 INSERT에 의해 삽입될 자동 증분 필드 값을 매우 쉽게 선택할 수 있습니다.다음으로 동작하는 예를 제시하겠습니다.
CREATE DEFINER = CURRENT_USER TRIGGER `lgffin`.`variable_BEFORE_INSERT` BEFORE INSERT
ON `variable` FOR EACH ROW
BEGIN
SET NEW.prefixed_id = CONCAT(NEW.fixed_variable, (SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lgffin'
AND TABLE_NAME = 'variable'));
END
언급URL : https://stackoverflow.com/questions/15300673/mysql-error-cant-update-table-in-stored-function-trigger-because-it-is-already
'source' 카테고리의 다른 글
잘못된 접두사 키 MySQL (0) | 2022.11.26 |
---|---|
사용자로부터 Yes/No 프롬프트를 표시하지 않고 자체 서명 증명서 추가 (0) | 2022.11.26 |
LocalDate를 Instant로 변환하는 방법 (0) | 2022.11.26 |
JSON을 데이터베이스에 저장하는 것과 각 키에 대해 새로운 열이 있는 경우 (0) | 2022.11.26 |
JavaScript에는 지정된 범위 내에서 범위를 생성하는 "range()"와 같은 메서드가 있습니까? (0) | 2022.11.26 |