Development Tip

다른 열에서 계산 된 열?

yourdevel 2020. 12. 10. 21:25
반응형

다른 열에서 계산 된 열?


다음 표가 주어집니다.

id | value
--------------
1     6
2     70

동일한 테이블의 다른 열을 기반으로 자동 계산되는 열을 추가하는 방법이 있습니까? VIEW와 같지만 동일한 테이블의 일부입니다. 예를 들어, calculated의 절반이 될 것입니다 value. VIEW처럼 변경 Calculated될 때 자동으로 업데이트되어야합니다 value.

결과는 다음과 같습니다.

id | value | calculated
-----------------------
1     6       3
2     70      35

생성 된 열은 5.7.6 이상인 MySql 버전에 대한 좋은 접근 방식 중 하나입니다.

생성 된 열에는 두 가지 종류가 있습니다.

  • 가상 (기본값)-테이블에서 레코드를 읽을 때 열이 즉시 계산됩니다.
  • 저장 됨-테이블에 새 레코드가 작성 / 업데이트 될 때 열이 계산됩니다.

두 유형 모두 NOT NULL 제한을 가질 수 있지만 저장된 생성 열만 인덱스의 일부가 될 수 있습니다.

현재의 경우 저장된 생성 컬럼을 사용하겠습니다. 구현하기 위해 계산에 필요한 두 값이 모두 표에 있다고 생각했습니다.

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; 구문은 다른 구분 기호로 구문 분석되어야합니다. 전체 shebang은 다음과 같습니다.

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 ;

다른 열의 절반으로 자동 업데이트되는 열을 테이블에 추가하려는 경우 트리거를 사용하여 수행 할 수 있습니다.

그러나 이미 제안 된 답변이이를 수행하는 더 좋은 방법이라고 생각합니다.

건식 코드 트리거 :

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;

우리가 응답해야하는 이벤트가 다르기 때문에 하나의 트리거 만 만들 수 있다고 생각하지 않습니다.


I hope this still helps someone as many people might get to this article. If you need a computed column, why not just expose your desired columns in a view ? Don't just save data or overload the performance with triggers... simply expose the data you need already formatted/calculated in a view.

Hope this helps...


You can use generated columns from MYSQL 5.7.

Example Usage:

ALTER TABLE tbl_test
ADD COLUMN calc_val INT 
GENERATED ALWAYS AS (((`column1` - 1) * 16) + `column2`) STORED;

VIRTUAL / STORED

  • Virtual: calculated on the fly when a record is read from a table (default)
  • Stored: calculated when a new record is inserted/updated within the table

참고URL : https://stackoverflow.com/questions/5222044/column-calculated-from-another-column

반응형