반응형
SQL을 INSERT IN...과(와) 함께 사용할 때 오류 1064가 발생합니다.선택...중복 키 업데이트 시
'INSERT IN...'을 사용하려고 합니다.중복 키 업데이트 기능'을 선택하지만, 지금 문제가 있습니다.
'fruitProperty' 테이블에 데이터를 삽입하고 싶습니다.
질문 내용은 다음과 같습니다.
START TRANSACTION;
SET @myVal1 := "";
SET @myVal2 := 0;
SET @myVal3 := 0;
SET @myVal4 := 0;
SET @myVal5 := 0;
SELECT masterIndex INTO @myVal1 FROM fruitMaster WHERE masterName = 'apple';
SELECT masterIndex INTO @myVal2 FROM fruitMaster WHERE masterName = 'banana';
SELECT masterIndex INTO @myVal3 FROM fruitMaster WHERE masterName = 'mango';
SELECT masterIndex INTO @myVal4 FROM fruitMaster WHERE masterName = 'melon';
SELECT masterIndex INTO @myVal5 FROM fruitMaster WHERE masterName = 'grape';
INSERT
INTO fruitProperty
(fruitID, masterIndex, cpValue)
SELECT A1.fruitID, A2.masterIndex, A2.cpValue
FROM (
SELECT A.fruitID
FROM fruit A
JOIN fruitProperty B ON A.fruitID = B.fruitID
WHERE B.masterIndex = @myVal1 AND B.cpValue = 1
) A1
CROSS JOIN
(
SELECT @myVal2 AS masterIndex, 1 AS cpValue
UNION
SELECT @myVal3, 1
UNION
SELECT @myVal4, 1
UNION
SELECT @myVal5, 1
) A2
ON DUPLICATE KEY UPDATE cpValue = cpValue + 1;
ROLLBACK;
에러 코드가 발생했습니다.
오류 코드: 1064 SQL 구문에 오류가 있습니다. 21행의 'KEY UPDATE cpValue = 1' 근처에서 사용할 올바른 구문은 MariaDB 서버 버전에 해당하는 설명서를 참조하십시오.
내 질문이 뭐가 문제죠?난 정말 모르겠어..
감사해요.
명시적 표현을 사용하면 문제가 발생합니까?join:
INSERT INTO fruitProperty (fruitID, masterIndex, cpValue)
SELECT f.fruitID, A2.masterIndex, A2.cpValue
FROM (SELECT f.fruitID
FROM fruit f JOIN
fruitProperty fp
ON f.fruitID = fp.fruitID
WHERE f.masterIndex = @myVal1 AND fp.cpValue = 1
) f JOIN
(SELECT @myVal2 AS masterIndex, 1 AS cpValue
UNION ALL
SELECT @myVal3, 1
UNION ALL
SELECT @myVal4, 1
UNION ALL
SELECT @myVal5, 1
) A2
ON 1=1
ON DUPLICATE KEY UPDATE cpValue = VALUES(cpValue) + 1;
MySQL/MariaDB는 다음 기능을 지원하므로 이 문제는 해석 문제일 것으로 생각됩니다.ON에 대한 조항.CROSS JOIN(으악!!!)근데...ON키워드가 혼동됩니다.
크로스 조인(CROSS JOIN)을 사용하지 않고 단순화할 수 있습니다.
MySql에서 CROSS JOIN은 아쉽게도 INSER JOIN의 동의어일 뿐입니다.
하지만 마지막은 원하지 않아ON키워드를 지정합니다.
샘플 데이터
create table fruitMaster (masterIndex int primary key, masterName varchar(30)); insert into fruitMaster (masterIndex, masterName) values (1, 'apple'),(2, 'banana'),(3, 'mango'),(4, 'melon'),(5, 'grape'), (6, 'prune'); create table fruit (fruitID int primary key, fruitName varchar(30)); insert into fruit (fruitID, fruitName) values (10,'jonagold'),(20,'straight banana'),(40,'big melons'); create table fruitProperty ( fruitID int, masterIndex int, cpValue int, primary key (fruitID, masterIndex)); insert into fruitProperty (fruitID, masterIndex, cpValue) values (10, 1, 1),(10, 2, 1),(10, 6, 1), (20, 2, 1),(30, 3, 1),(40, 4, 1);
쿼리 삽입
INSERT INTO fruitProperty (fruitID, masterIndex, cpValue) SELECT F.fruitID, FM2.masterIndex, 1 AS cpValue FROM fruit F JOIN fruitProperty FP ON (FP.fruitID = F.fruitID AND FP.cpValue = 1) JOIN fruitMaster FM1 ON (FM1.masterIndex = FP.masterIndex AND FM1.masterName = 'apple') JOIN fruitMaster FM2 ON FM2.masterName IN ('banana', 'mango', 'melon', 'grape') ON DUPLICATE KEY UPDATE cpValue = 2;
결과:
SELECT * FROM fruitProperty;fruitID | 마스터인덱스 | cpValue------: | ----------: | ------:10 | 1 | 110 | 2 | 210 | 3 | 110 | 4 | 110 | 5 | 110 | 6 | 120 | 2 | 130 | 3 | 140 | 4 | 1
db <>여기에 추가
언급URL : https://stackoverflow.com/questions/53500165/error-1064-when-using-sql-with-insert-into-select-on-duplicate-key-updat
반응형
'programing' 카테고리의 다른 글
| 현재 스크립트 디렉토리를 올바르게 판별하려면 어떻게 해야 합니까? (0) | 2022.11.13 |
|---|---|
| "Unused variable x" 경고를 억제하는 가장 좋은 방법은 무엇입니까? (0) | 2022.11.13 |
| @Transactional on class와 메서드의 차이점은 무엇입니까? (0) | 2022.11.13 |
| Apache는 php 파일을 표시하는 대신 다운로드하고 있습니다. (0) | 2022.11.13 |
| MySQL은 두 열을 하나의 열에 결합합니다. (0) | 2022.11.13 |