복붙노트

[SQL] 열은 다른 열에서 계산?

SQL

열은 다른 열에서 계산?

주어진 다음의 표 :

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

자동으로 동일한 테이블의 다른 열을 기준으로 계산 된 열을 추가 할 수있는 방법이 있습니까? 같은 테이블의 VIEW하지만 일부처럼. 예로서, 계산 된 값의 절반이 될 것이다. 값이 변경, 뷰는 것처럼 때 자동으로 업데이트해야합니다 계산.

그 결과는 다음과 같습니다

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

해결법

  1. ==============================

    1.생성 된 열은 5.7.6 이상이다 MySQL 버전에 대한 좋은 방법 중 하나입니다.

    생성 된 열은 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);
    

    금액은 자동으로 테이블에 나타납니다 그리고 당신은 또한 당신이 모든 열을 업데이트 할 때마다, 금액도 업데이트됩니다 점에 유의하시기 바랍니다, 직접 액세스 할 수 있습니다.

  2. ==============================

    2.이 선택 인 경우, 당신은 그것을 같이 할 수 있습니다 :

    이 선택 인 경우, 당신은 그것을 같이 할 수 있습니다 :

    SELECT id, value, (value/2) AS calculated FROM mytable
    

    그 밖에, 당신은 또한 첫번째 누락 된 열을 추가 한 다음 새 열 등의 값을 계산하는 UPDATE 질의를 수행 할 테이블을 변경할 수 있습니다 :

    UPDATE mytable SET calculated = value/2;
    

    이 자동해야하고 MySQL 버전이 그것을 허용하는 경우, 당신은 트리거로 시도 할 수 있습니다

  3. ==============================

    3.MySQL의 5.7 지원은 열을 계산. 그들은 "생성 된 열"을 호출하고 구문은 약간 이상한이지만, 내가 다른 데이터베이스에서 볼 수있는 동일한 옵션을 지원합니다.

    MySQL의 5.7 지원은 열을 계산. 그들은 "생성 된 열"을 호출하고 구문은 약간 이상한이지만, 내가 다른 데이터베이스에서 볼 수있는 동일한 옵션을 지원합니다.

    https://dev.mysql.com/doc/refman/5.7/en/create-table.html#create-table-generated-columns

  4. ==============================

    4.@ krtek의 대답은 올바른 방향이지만, 문제의 몇 가지가 있습니다.

    @ krtek의 대답은 올바른 방향이지만, 문제의 몇 가지가 있습니다.

    나쁜 소식은 같은 테이블에 트리거에서 UPDATE를 사용하여 작동하지 않을 것입니다. 좋은 소식은 필요가 없습니다 것입니다; 당신이 테이블도 터치하기 전에에서 작동 할 수있는 새 개체가있다.

    트리거가된다 :

    CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table
      FOR EACH ROW BEGIN
        SET NEW.calculated = NEW.value/2;
      END;
    

    또한 참고가 시작 것을 ... 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 ;
    
  5. ==============================

    5.자동으로 다른 컬럼의 절반에 업데이트됩니다 테이블에 열을 추가하려면 트리거로 그렇게 할 수 있습니다.

    자동으로 다른 컬럼의 절반에 업데이트됩니다 테이블에 열을 추가하려면 트리거로 그렇게 할 수 있습니다.

    그러나 나는 이미 제안 된 답변이 할 수있는 더 좋은 방법이 생각합니다.

    코딩 트리거를 건조 :

    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;
    

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

  6. ==============================

    6.나는 많은 사람들이이 문서에 도착 하듯이 아직도 누군가를 도움이되기를 바랍니다. 당신이 계산 열이 필요하다면, 왜 그냥보기에서 원하는 열을 노출하지? 단지 데이터를 저장하지 않습니다 또는 트리거와 성능에 과부하가 ... 단순히보기에 계산 이미 포맷 필요한 데이터를 / 노출.

    나는 많은 사람들이이 문서에 도착 하듯이 아직도 누군가를 도움이되기를 바랍니다. 당신이 계산 열이 필요하다면, 왜 그냥보기에서 원하는 열을 노출하지? 단지 데이터를 저장하지 않습니다 또는 트리거와 성능에 과부하가 ... 단순히보기에 계산 이미 포맷 필요한 데이터를 / 노출.

    도움이 되었기를 바랍니다...

  7. ==============================

    7.당신은 MYSQL 5.7에서 발생하는 열을 사용할 수 있습니다.

    당신은 MYSQL 5.7에서 발생하는 열을 사용할 수 있습니다.

    사용 예 :

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

    / 가상 STORED

  8. from https://stackoverflow.com/questions/5222044/column-calculated-from-another-column by cc-by-sa and MIT license