열이 다른 열에서 계산되었습니까?
다음 표에 기재되어 있습니다.
id | value
--------------
1 6
2 70
같은 표의 다른 열을 기준으로 자동으로 계산되는 열을 추가하는 방법이 있습니까?VIEW와 비슷하지만 같은 테이블의 일부입니다.예를 들면,calculated
의 반이 될 것이다value
.Calculated
다음 시간에 자동으로 업데이트되어야 합니다.value
VIEW와 마찬가지로 변화합니다.
결과는 다음과 같습니다.
id | value | calculated
-----------------------
1 6 3
2 70 35
Generated Column은 MySql 버전 5.7.6 이상에 적합한 접근법 중 하나입니다.
생성된 열에는 다음 두 종류가 있습니다.
- 가상(기본값) - 테이블에서 레코드를 읽을 때 열이 즉시 계산됩니다.
- 저장됨 - 테이블에 새 레코드가 기록/업데이트될 때 열이 계산됩니다.
두 유형 모두 NULL 제한을 가질 수 없지만 저장된 Generated Column만 인덱스의 일부가 될 수 있습니다.
현시점에서는 저장된 생성 컬럼을 사용합니다.구현하기 위해 계산에 필요한 두 값이 모두 표에 있는 것을 고려했습니다.
CREATE TABLE order_details (price DOUBLE, quantity INT, amount DOUBLE AS (price * quantity));
INSERT INTO order_details (price, quantity) VALUES(100,1),(300,4),(60,8);
금액은 자동으로 테이블에 표시되며 사용자가 직접 액세스할 수 있습니다. 또한 열을 업데이트할 때마다 금액도 업데이트됩니다.
선택 항목인 경우 다음과 같이 수행할 수 있습니다.
SELECT id, value, (value/2) AS calculated FROM mytable
또는 먼저 테이블을 변경하여 누락된 열을 추가한 다음 UPDATE 쿼리를 수행하여 새 열의 값을 다음과 같이 계산할 수도 있습니다.
UPDATE mytable SET calculated = value/2;
MySQL 버전이 허용하고 자동이어야 하는 경우 트리거를 사용하여 시도할 수 있습니다.
MySQL 5.7은 계산된 열을 지원합니다."Generated Columns"라고 불리며 구문이 조금 이상하지만 다른 데이터베이스에서 볼 수 있는 것과 동일한 옵션을 지원합니다.
https://dev.mysql.com/doc/refman/5.7/en/create-table.html#create-table-generated-columns
@krtek의 답변은 올바른 방향이지만 몇 가지 문제가 있습니다.
단점은 같은 테이블의 트리거에서 UPDATE를 사용할 수 없다는 것입니다.좋은 소식은 이것이 필요하지 않다는 것입니다. 테이블을 만지기 전에 조작할 수 있는 새로운 개체가 있습니다.
트리거는 다음과 같습니다.
CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table
FOR EACH ROW BEGIN
SET NEW.calculated = NEW.value/2;
END;
또한 BEGIN은...END. 구문은 다른 딜리미터로 해석해야 합니다.전체 쉐방은 다음과 같습니다.
DELIMITER |
CREATE TRIGGER halfcolumn_insert BEFORE INSERT ON my_table
FOR EACH ROW BEGIN
SET NEW.calculated = NEW.value/2;
END;
|
CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table
FOR EACH ROW BEGIN
SET NEW.calculated = NEW.value/2;
END;
|
DELIMITER ;
MYSQL 5.7에서 생성된 열을 사용할 수 있습니다.
사용 예:
ALTER TABLE tbl_test
ADD COLUMN calc_val INT
GENERATED ALWAYS AS (((`column1` - 1) * 16) + `column2`) STORED;
가상 / 저장
- 가상: 테이블에서 레코드를 읽을 때 즉시 계산됩니다(기본값).
- 저장됨: 테이블 내에 새 레코드가 삽입/업데이트될 때 계산됨
다른 열의 절반으로 자동 업데이트되는 열을 테이블에 추가하려면 트리거를 사용하여 이 작업을 수행할 수 있습니다.
하지만 나는 이미 제안된 답변이 이것을 하기 위한 더 나은 방법이라고 생각한다.
드라이 코딩 트리거:
CREATE TRIGGER halfcolumn_insert AFTER INSERT ON table
FOR EACH ROW BEGIN
UPDATE table SET calculated = value / 2 WHERE id = NEW.id;
END;
CREATE TRIGGER halfcolumn_update AFTER UPDATE ON table
FOR EACH ROW BEGIN
UPDATE table SET calculated = value / 2 WHERE id = NEW.id;
END;
우리가 대응해야 하는 이벤트가 다르기 때문에 당신은 하나의 트리거만 할 수 있다고 생각하지 않습니다.
나는 이것이 여전히 많은 사람들이 이 기사에 접근할 수 있는 사람들에게 도움이 되기를 바란다.계산된 열이 필요한 경우 원하는 열을 뷰에 표시하는 것이 어떨까요?데이터를 저장하거나 트리거로 성능을 과부하시키지 마십시오.뷰에 이미 포맷/증명된 데이터를 표시하기만 하면 됩니다.
이게 도움이 되길...
언급URL : https://stackoverflow.com/questions/5222044/column-calculated-from-another-column
'itsource' 카테고리의 다른 글
PDO 준비됨 단일 쿼리에 여러 행을 삽입합니다. (0) | 2023.01.19 |
---|---|
MySQL이 "데이터 전송 중" 상태이면 어떤 의미입니까? (0) | 2023.01.19 |
mysql LIKE는 어떻게 대소문자를 구분합니까? (0) | 2023.01.15 |
비동기 콜백함수에서 값을 반환하려면 어떻게 해야 합니까? (0) | 2023.01.15 |
Persistent LocalDateTimeAsString이 DateTimeParseException이 되다 (0) | 2023.01.15 |