다른 열에서 계산 된 열?
다음 표가 주어집니다.
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
'Development Tip' 카테고리의 다른 글
비디오 파일의 길이를 얻는 방법은 무엇입니까? (0) | 2020.12.10 |
---|---|
.NET의 Windows 서비스에서 현재 로그인 된 사용자 이름을 얻으려면 어떻게합니까? (0) | 2020.12.10 |
Bash if 문에서 대괄호는 언제 필요합니까? (0) | 2020.12.10 |
NameError : 'reload'이름이 정의되지 않았습니다. (0) | 2020.12.10 |
Grunt를 사용하는 노드 앱을 Heroku에 배포하는 방법 (0) | 2020.12.10 |