ホームページ >データベース >mysql チュートリアル >Mysql を使用して 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 型を使用します
ここでは json フィールド形式を作成しませんでしたが、テキストを使用して json を保存しました。
注意: JSON タイプを使用する場合、列に格納されるデータは JSON 形式に準拠している必要があります。準拠していない場合はエラーが発生します。 2) JSON データ型にはデフォルト値がありません。
json 形式のデータをこの列に挿入します:
{"age": "28", "pwd": "lisi", "name": "李四"}
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 'off_main' `names_virtual` VARCHAR(20) GENERATED ALWAYS AS (`json_field` ->> '$.name') 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,'$.phone', '132') WHERE id = 45 //同时修改多个 UPDATE offcn_off_main set json_field = json_set(json_field,'$.name',456,'$.age','bbb') WHERE id = 45
存在する json_set() メソッドは上書きされ、存在しないメソッドは追加されます。
UPDATE offcn_off_main set json_field = json_remove(json_field,'$.pwd','$.phone') WHERE id = 45
UPDATE offcn_off_main set json_field = json_insert(json_field,'$.pwd','111') WHERE id = 45
挿入と更新の違いは、挿入が存在しない場合は追加され、存在する場合は追加されないことです。
1. データ量が少ない場合は、json データを mysql の json フィールドに直接コピーします。データが大きすぎる場合は、 Java およびその他のバックグラウンド フォームを通じて JSON データを解析し、データベースに書き込みます。
クエリ操作
select *,json->'$.features[0].geometry.rings' as rings from JSON;
あるテーブルからデータの一部を読み取り、別のテーブルに格納します (1 つのデータ)
insert into DT_village(name, border) SELECT json->'$.features[0].attributes.CJQYMC',json->'$.features[0].geometry.rings' 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('$.features[',i,'].attributes.CJQYMC'); set b=CONCAT('$.features[',i,'].geometry.rings'); insert into DT_village(name, border) select #json->'$.features[0].attributes.CJQYMC',json->'$.features[0].geometry.rings' # (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 サイトの他の関連記事を参照してください。