2016-11-02 3 views
0

json 형식으로 필드를 변경하는 로그 테이블이 있습니다. 지금 당장 우리는 버전과 diff에 대한 전체 데이터를 가져 와서 응용 프로그램에 저장합니다. 하지만 많은 데이터를 가져 와서 OOM을 끌어 와서 DB 측에서하고 싶습니다.mysql에서 json 데이터를 쉽게 만들 수 있습니까?

자기 조서로 변경된 기록을 얻을 수는 있지만 json에서 변경된 데이터를 만들지는 모릅니다.

json 문자열을 생성하는 방법이 있습니까?

다음은 스키마입니다.

create table A { id int not null primary key auto_increment, 
      code int not null, 
      version int not null, 
      name varcher(10) not null, 
      content varcahr(10) not null) ; 

create table logging (id int not null primary key auto_increment, 
        version int not null, 
        code int not null, 
        changed varcher(1024)); 

INSERT INTO logging (version, code , changed) 
SELECT A2.version, A2.code, ?     <- I don't know how create json 
FROM A A1 inner join A A2 ON A1.code = A2.code 
WHERE A1.version = 1 AND A2.version = 2 
    AND (A1.name != A2.name OR A1.content != A2.content) 

나는 다음과 같은 JSON을 만들고 싶어 { "이름": "업데이트 됨"}에만 이름이 변경되면 { "이름": "업데이트 됨", "내용": "UPDATED_CONTENT"} 이름 경우 & 콘텐츠가 변경되었습니다. (이후에는 샘플 데이터 및 샘플 출력이 없기 때문에) 내가 완전히 원하는 출력을 이해한다면 내가 MariaDB 10.0.22

답변

0

확실하지를 사용하고

.

또한 JSON으로 데이터를 변환하는 MySQL 명령이 있다고 생각하지 않습니다. 응용 프로그램 쪽에서 더 쉽게 할 수도 있고, 문자열 연결을 사용하여 쿼리에서 작성할 수도 있습니다 (일반적으로 이것은 최선의 방법은 아닙니다! JSON 구문이 간단하고 짧으면 괜찮을 수도 있음).

데이터베이스에 JSON 문자열을 저장하는 것도 좋지 않습니다. 테이블 A 인 경우 테이블 logging이 필요한 이유는 무엇입니까?

INSERT INTO logging (VERSION, CODE , CHANGED) 
SELECT A2.version, A2.code, 
IF(A1.content = A2.content, 
    -- no content change 
    CONCAT("{\"name\":\"", A2.name, "\"}"), 
    -- content was also changed 
    CONCAT("{\"name\":\"", A2.name, "\", \"content\": \"", A2.content, "\"}")) AS json_description      
FROM A A1 INNER JOIN A A2 ON A1.code = A2.code 
WHERE A1.version = 1 AND A2.version = 2 
    AND (A1.name != A2.name OR A1.content != A2.content) 
+1

데이터베이스 측이 아닌 응용 프로그램 측에서 JSON을 어셈블하는 것이 가장 좋습니다. – sylverfyre

관련 문제