我的網站使用mysql。不幸的是,由于以前的開發人員,資料庫設計很糟糕,對其進行更改需要很多時間。
我想解釋我想做什么。我有一個名為內容的表。
| ID | 內容 | 類別ID |
|---|---|---|
| 1 | { "content_de": "一些德語內容", "content_en": ""} | 150 |
| 2 | { "content_de": "一些德語內容 2", "content_en": ""} | 150 |
因此,如您所見, content_en 鍵在 content 列的 json 中為空。我想將 content_de 鍵的值復制到 content_en 鍵的值,其中 category_id 為 150。
結果應該是查詢后的樣子。
| ID | 內容 | 類別ID |
|---|---|---|
| 1 | { “content_de”:“一些德國內容”,“content_en”:“一些德國內容”} | 150 |
| 2 | { “content_de”:“一些德語內容 2”,“content_en”:“一些德語內容 2”} | 150 |
我怎樣才能完成這項任務?
uj5u.com熱心網友回復:
您可以通過使用函式來執行 JSON 值的部分更新,JSON_SET()例如
UPDATE person p
SET content = JSON_SET(
content,
'$.content_en',
JSON_EXTRACT(content, '$.content_de')
)
WHERE category_id = 150
Demo
上面的5.7也適用于資料庫的版本,但是如果您的資料庫的當前版本是8.0 ,那么以下可能是另一種使用選項
UPDATE person p
JOIN JSON_TABLE(
p.content,
'$.content_de' COLUMNS (extracted_content VARCHAR(800) PATH '$')
) j
SET content = JSON_SET(content, '$.content_en', extracted_content)
WHERE category_id = 150
uj5u.com熱心網友回復:
我找到了我的解決方案。我不得不使用存盤程序迭代地更新行中鍵的值。
內容行的 json 資料中還有很多鍵(不僅是 content_de)。所以我只是在while回圈中為每個鍵一一創建并宣告了查詢。
實際上,首先,我嘗試使用通配符來不應用這種方式。
那可能是這樣;“找到以_de結尾的鍵,然后用以_en結尾的鍵的值替換它們的值”。但后來我意識到這需要另一種控制機制,比如匹配相同的鍵等。
我剛剛用這個查詢解決了我的問題。
DROP PROCEDURE IF EXISTS updateJSONData;
DELIMITER //
CREATE PROCEDURE updateJSONData()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SET @menuID = 151;
SET i = 0;
select COUNT(id) from sayfa_icerik where menuID = @menuID and durum = 1 and lang_en = 1 INTO n;
WHILE i < n DO
SET @id = (select id from sayfa_icerik where menuID = @menuID and durum = 1 and lang_en = 1 LIMIT i,1);
set @sertifika = (SELECT json_extract(icerik, '$.sertifika_de') FROM sayfa_icerik WHERE menuId = @menuID and id = @id);
update sayfa_icerik set icerik = json_replace(icerik, '$.sertifika_en', JSON_UNQUOTE(@sertifika)) where menuId = @menuID and id = @id;
...
set @video = (SELECT json_extract(icerik, '$.video_de') FROM sayfa_icerik WHERE menuId = @menuID and id = @id);
update sayfa_icerik set icerik = json_replace(icerik, '$.video_en', JSON_UNQUOTE(@video)) where menuId = @menuID and id = @id;
...
SET i = i 1;
END WHILE;
END //
call updateJSONData;
注意:OP在問題部分提供的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471306.html
