2

테이블 A의 생성 된 열을 생성하여 테이블 B의 열과 테이블 A의 행의 tableA_id를 합산 할 수 있습니까?하위 쿼리가 mysql에서 생성 된 열로?

나는 가족의 테이블과 아이들의 테이블을 가지고 있다고 가정합니다. 나는 각 가족을위한 아이들의 나이의 합을 원한다.

ALTER TABLE people.families 
ADD COLUMN sumofages DECIMAL(10,2) GENERATED ALWAYS AS 
(SELECT SUM(age) FROM people.children WHERE family_id = people.families.id) STORED; 

ERROR 3102: Expression of generated column 'sumofages' contains a disallowed function. 

나는 가상 유형으로 저장할 수 없습니다. 여기서 내가 뭘 잘못하고 있니?

ALTER TABLE people.families 
ADD COLUMN sumofages DECIMAL(10,2) GENERATED ALWAYS AS 
(SELECT SUM(age) FROM people.children WHERE family_id = people.families.id) VIRTUAL; 

ERROR 3102: Expression of generated column 'sumofages' contains a disallowed function. 

나는 어떤 기능을 허용하지 않는지 알 수 없습니다. SUM은 그럴 것 같지 않습니다. 아마 SELECT?

+0

MySQL이 사용자가하려는 것을 지원하지 않는다고 생각합니다. 'UPDATE' 문에 만족하겠습니까? –

+0

현재 하위 선택을 사용 중입니다. 실제로 데이터를 저장하고 싶지 않습니다. 엄청난 양의 하위 선택이 있습니다. MySQL에서 확실한 설명서를 찾을 수 없으므로 지원되지 않습니다. MariaDB에서 문서는 그것이 지원되지 않는다는 것을 암시하며, 생성 된 표현식은 현재 행 내에있는 데이터 만 포함 할 수 있습니다. 나는 단지 내가 뭔가를 놓치지 않았 음을 확신하고 싶었다. – user1955162

답변

0

이 시도 ..

 
     ALTER TABLE people.families 
     ADD COLUMN sumofages DECIMAL(10,2) GENERATED ALWAYS AS 
     (SELECT SUM(CAST(age) as Decimal(10,2)) FROM people.children WHERE family_id =  people.families.id) VIRTUAL; 

가 호프가 ..

+0

ERROR 3102 (HY000) : 생성 된 열 'mrc'의 표현식에 허용되지 않는 함수가 포함되어 있습니다. – user1955162

+0

난 여전히이있어, 난 캐스트 (SUM()() (캐스트 (SUM()() – user1955162

3

계산 된 칼럼의 아이디어는 기록 예에 다른 열로부터 데이터를 추출하는 것이다 국가 코드를 우편 번호와 결합하여 DE와 12345를 저장하면 주소에서 사용할 수있는 DE-12345를 얻을 수 있습니다.

그러나 무엇을하려고하는지는 완전히 다른 것입니다. 다른 테이블의 데이터에 액세스하고 있습니다. 그러나 해당 테이블의 데이터가 변경 될 수 있으므로 동일한 레코드에 액세스 할 때 갑자기 완전히 다른 결과가 발생할 수 있습니다. 계산 된 열은 결정 론적 값을 포함해야하므로 레코드의 데이터가 변경되지 않는 한 변경되지 않습니다. 이 점에 관해서는 MySQL에 관해서는 알지 못하지만 하위 쿼리와 같이 결정적이지 않은 데이터는 금지합니다.

실제로 찾고있는 것은보기입니다. 뷰는 원하는대로 다른 테이블의 선택 항목을 결합 할 수 있습니다. 그래서 내가 구문 권리를 얻었기를 바랍니다

create view familydata as 
(
    select f.*, sum(c.age) as sumofages 
    from families f 
    join children c on c.family_id = f.id 
    group by f.id 
); 

또는

create view familydata as 
(
    select f.*, 
    (
    select sum(age) 
    from children c 
    where c.family_id = f.id 
) as sumofages 
    from families f 
); 

를 사용합니다.

5

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

생성 된 열 표현식은 다음과 같은 규칙을 준수해야합니다. 식이 허용되지 않는 구문을 포함하면 오류가 발생합니다.

  • 서브 쿼리, 파라미터, 변수, 저장 기능, 사용자 정의 기능은 허용되지 않는다.

이 생성 된 열에 대한 표현은 동일한 행에서 단지 열을 참조 할 수있는 합리적인. 생성 된 열은 하위 쿼리를 사용하거나 다른 테이블을 참조하거나 비 결정적 출력이있는 함수를 사용할 수 없습니다.

생성 된 열이 테이블 간 참조를 지원한다고 가정합니다. 특히 생성 된 열이 STORED 인 경우를 고려하십시오.

테이블을 업데이트하면 업데이트 된 행을 참조하는 경우 생성 된 열의 참조가 데이터베이스의 다른 곳에서도 업데이트되어야합니다. MySQL이 모든 참조를 추적하는 것은 복잡하고 비용이 많이 든다.

그런 다음 저장된 함수를 통해 간접 참조를 추가하는 것이 좋습니다.

그런 다음 업데이트가 트랜잭션의 InnoDB 테이블에 있다고 가정하지만 생성 된 열은 비 트랜잭션 (MyISAM, MEMORY, ARCHIVE 등) 테이블에있을 수 있습니다. 생성 된 열에 업데이트가 반영되어야합니까? 롤백하면 어떨까요? 커밋 할 때 업데이트가 반영되어야합니까? 그렇다면 MySQL이 이러한 테이블에 적용하기 위해 어떻게 변경해야합니까? 여러 트랜잭션이 생성 된 열 참조에 영향을주는 업데이트를 커밋하면 어떻게됩니까? 어느 쪽이 이길 것인가, 마지막으로 변경을 적용한 것 또는 마지막으로 변경 한 것.

이러한 이유로 인해 생성 된 열이 동일한 테이블의 같은 행에있는 열 이외의 다른 참조를 허용하지 못합니다.

+1

난 정말 어떻게 설명서를 생성 된 열에 하위 쿼리가 허용되지 않는 모든 명확한 볼 수 없습니다. – Jocelyn