ホームページ > データベース > mysql チュートリアル > Mysql を使用して JSON データをクエリおよび変更する方法

Mysql を使用して JSON データをクエリおよび変更する方法

王林
リリース: 2023-06-02 20:19:17
転載
5053 人が閲覧しました

    json データのクエリと変更

    • フィールド ->「$.json 属性」を使用して条件をクエリする

    • json_extract 関数を使用してクエリを実行します。json_extract(field, "$.json attributes")

    • json 配列に基づいてクエリを実行するには、JSON_CONTAINS(field) を使用します。 、JSON_OBJECT( 'json 属性', "content")): [{}]この形式の json 配列をクエリします

    • MySQL5.7 以降は JSON 操作をサポートし、JSON ストレージ タイプを追加します

    • 一般に、データベースは JSON 型データを保存するために JSON 型または TEXT 型を使用します

    いくつかの関連関数

    Mysql を使用して JSON データをクエリおよび変更する方法

    Mysql を使用して JSON データをクエリおよび変更する方法

    ここでは json フィールド形式を作成しませんでしたが、テキストを使用して json を保存しました。

    注意: JSON タイプを使用する場合、列に格納されるデータは JSON 形式に準拠している必要があります。準拠していない場合はエラーが発生します。 2) JSON データ型にはデフォルト値がありません。

    json 形式のデータをこの列に挿入します:

    {"age": "28", "pwd": "lisi", "name": "李四"}
    ログイン後にコピー

    Query

    1,

    select * from `offcn_off_main` where json_extract(json_field,"$.name") = '李四'
    ログイン後にコピー

    2,

    select * from `offcn_off_main` where json_field->'$.name' = '李四'
    ログイン後にコピー

    Useインデックスが使用できないことを確認するために説明します。

    したがって、これを変更する必要があります:

    mysql は、json 列の属性インデックス付けをネイティブにサポートしていませんが、mysql の仮想列を通じて間接的に json 内の特定の項目にインデックスを付けることができます。属性のインデックスを作成する原理は、json で属性の仮想列を作成し、次にその仮想列のインデックスを作成することにより、間接的に属性のインデックスを作成することです。

    MySQL 5.7 では、仮想生成列と保存された生成列の 2 種類の生成列がサポートされています。前者は生成列をデータ ディクショナリ (テーブルのメタデータ) に保存するだけで、この列は保存されませんディスクに永続化します。後者は、生成された列を読み取られるたびに計算するのではなく、ディスクに永続化します。明らかに、後者は既存のデータから計算できるデータを保存し、より多くのディスク領域を必要とし、仮想列に比べて利点がありません----(実際、必要なクエリ計算が少なくて済むので、まだ利点があると思います) . )

    したがって、MySQL 5.7 では、生成されたカラムのタイプは指定されておらず、デフォルトは仮想カラムです。

    Stored Generated Golumn が必要な場合は、Virtual Generated Column にインデックスを作成する方が適切かもしれません。通常の状況では、MySQL のデフォルトの方法でもある Virtual Generated Column が使用されます。

    形式は次のとおりです:

    fieldname <type> [ GENERATED ALWAYS ] AS ( <expression> ) [ VIRTUAL|STORED ] [ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ]
    ログイン後にコピー

    ここにいます:

    ALTER TABLE &#39;off_main&#39; `names_virtual` VARCHAR(20) GENERATED ALWAYS AS (`json_field` ->> &#39;$.name&#39;) not null;
    ログイン後にコピー

    注: 参照には「>>」演算子を使用できます。 JSON フィールドのキー (KEY)。この例では、仮想フィールド names_virtual が null 非許容として定義されています。実際の業務では、具体的な状況に応じて判断する必要があります。 JSON 自体は構造が弱いデータ オブジェクトであるためです。言い換えれば、その構造は固定されていません。

    仮想フィールドにインデックスを追加します:

    CREATE INDEX `names` ON `off_main`(`names_virtual`);
    ログイン後にコピー

    仮想フィールドがテーブルの作成時に追加されず、後でインデックスを追加するときに追加される場合、仮想フィールドが一部の行は null ですが、null ではないように設定されている場合、インデックスを正常に作成できず、プロンプト列を null にすることはできません。

    インデックスを追加した後、説明してください。インデックスが使用され、仮想フィールドの値は変更されると自動的に変更されます。json フィールドのプロパティは変更されると自動的に変更されます。

    変更内容を見てみましょう

    update off_main set json_field = json_set(json_field,&#39;$.phone&#39;, &#39;132&#39;) WHERE id = 45 
    //同时修改多个
    UPDATE offcn_off_main set json_field = json_set(json_field,&#39;$.name&#39;,456,&#39;$.age&#39;,&#39;bbb&#39;) WHERE id = 45
    ログイン後にコピー

    存在する json_set() メソッドは上書きされ、存在しないメソッドは追加されます。

    削除

    UPDATE offcn_off_main set json_field = json_remove(json_field,&#39;$.pwd&#39;,&#39;$.phone&#39;) WHERE id = 45
    ログイン後にコピー

    挿入

    UPDATE offcn_off_main set json_field = json_insert(json_field,&#39;$.pwd&#39;,&#39;111&#39;) WHERE id = 45
    ログイン後にコピー

    挿入と更新の違いは、挿入が存在しない場合は追加され、存在する場合は追加されないことです。

    Mysql は json データを処理します。

    1. データ量が少ない場合は、json データを mysql の json フィールドに直接コピーします。データが大きすぎる場合は、 Java およびその他のバックグラウンド フォームを通じて JSON データを解析し、データベースに書き込みます。

    クエリ操作

    select *,json->&#39;$.features[0].geometry.rings&#39; as rings from JSON;
    ログイン後にコピー

    あるテーブルからデータの一部を読み取り、別のテーブルに格納します (1 つのデータ)

    insert into DT_village(name, border) SELECT
      json->&#39;$.features[0].attributes.CJQYMC&#39;,json->&#39;$.features[0].geometry.rings&#39;
    from JSON;
    ログイン後にコピー

    json データを読み取り、データベース(この時メソッドは定義された関数の形式で実行され、量も定義可能)

    #清空数据库
    TRUNCATE table DT_village;
     
    #定义存储过程
    delimiter //
    DROP PROCEDURE IF EXISTS insert_test_val;
    ##num_limit 要插入数据的数量,rand_limit 最大随机的数值
    CREATE PROCEDURE insert_test_val()
      BEGIN
     
        DECLARE i int default 0;
        DECLARE a,b varchar(5000);
     
        WHILE i<10 do
          set a=CONCAT(&#39;$.features[&#39;,i,&#39;].attributes.CJQYMC&#39;);
          set b=CONCAT(&#39;$.features[&#39;,i,&#39;].geometry.rings&#39;);
          insert into DT_village(name, border) select
                  #json->&#39;$.features[0].attributes.CJQYMC&#39;,json->&#39;$.features[0].geometry.rings&#39;
                                                     # (json->a),(json->b)
       json_extract(json,a),json_extract(json,b)
          from JSON;
          set i = i + 1;
     
        END WHILE;
     
      END
    //
     
    #调用存储过程
    call insert_test_val();
    ログイン後にコピー

    カーソルを呼び出してjsosnデータの行を取得し、挿入操作を実行します

    rreee

    以上がMysql を使用して JSON データをクエリおよび変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート