1

Marks_2017.csv

Name, class, Marks
"a1", 9, '{"Halfyr_T" : "45", "Halfyr_P" : "35", "Annual_T" : "42", "Annual_P" : "40"}'
"a2", 9, '{"Halfyr_T" : "45", "Halfyr_P" : "35", "Annual_T" : "42", "Annual_P" : "40"}'
"a3", 9, '{"Halfyr_T" : "45", "Halfyr_P" : "35", "Annual_T" : "42", "Annual_P" : "40"}'
"b1", 10, '{"Halfyr_T" : "45", "Halfyr_P" : "35", "Annual_T" : "42", "Annual_P" : "40"}'
"b2", 10, '{"Halfyr_T" : "45", "Halfyr_P" : "35", "Annual_T" : "42", "Annual_P" : "40"}'
"b3", 10, '{"Halfyr_T" : "45", "Halfyr_P" : "35", "Annual_T" : "42", "Annual_P" : "40"}'

Marks_2017_Update.csv

Name, class, Marks
"a1", 9, '{"Halfyr_T" : "-1", "Halfyr_P" : "-1", "Annual_T" : "-1", "Annual_P" : "-1", "Assignment" : "0"}'
"a2", 9, '{"Halfyr_T" : "-1", "Halfyr_P" : "-1", "Annual_T" : "-1", "Annual_P" : "-1", "Assignment" : "0"}'
"a3", 9, '{"Halfyr_T" : "-1", "Halfyr_P" : "-1", "Annual_T" : "-1", "Annual_P" : "-1", "Assignment" : "0"}'
"b1", 10, '{"Halfyr_T" : "0", "Halfyr_P" : "-1", "Annual_T" : "-1", "Annual_P" : "-1", "Assignment" : "0", "Quiz" : "-1"}'
"b2", 10, '{"Halfyr_T" : "0", "Halfyr_P" : "-1", "Annual_T" : "-1", "Annual_P" : "-1", "Assignment" : "0", "Quiz" : "-1"}'
"b3", 10, '{"Halfyr_T" : "0", "Halfyr_P" : "-1", "Annual_T" : "-1", "Annual_P" : "-1", "Assignment" : "0", "Quiz" : "-1"}'
"c1", 8, '{"Halfyr_T" : "0", "Halfyr_P" : "0", "Annual_T" : "0", "Annual_P" : "0", "Assignment" : "-1"}'
"c2", 8, '{"Halfyr_T" : "0", "Halfyr_P" : "0", "Annual_T" : "0", "Annual_P" : "0", "Assignment" : "-1"}'
"c3", 8, '{"Halfyr_T" : "0", "Halfyr_P" : "0", "Annual_T" : "0", "Annual_P" : "0", "Assignment" : "-1"}'

Reference solution am trying to follow:

MySQL LOAD DATA INFILE with ON DUPLICATE KEY UPDATE

-> key is name_class

-> During insert into Marks_2017 (ON DUPLICATE KEY), using Marks_2017_Update, if duplicate key is found

  1. For new json_key in Marks_2017_update, irrespective of "0"/"-1" key value, append those new json_keys and json_value set to "0". (For ex:- Assignment for class 9 and Assignment and Quiz for class 10, Set to "0" in Marks_2017)

  2. if json_value is "-1" don't change the json_value in Marks_2017 (if json_key is already present).

  3. Reset Marks_2017 json_key value to "0" if Marks_2017_update json_key value is "0" for existing key (i.e. reset marks of class 10, Halfyr_T to "0" in Marks_2017 as value is "0" for class 10, Halfyr_T in Marks_2017_Update)

-> For new key, insert records to Marks_2017 with Default value "0". (Ex:- For class 8, Assignment in Marks_2017_Update, value is "-1", Still, in Marks_2017 it shud be inserted with "0", As it is a new record.)

Am majorly facing issue while checking json_key and updating its values.

Tried using json_extract, json_set and json_merge. but unable to resolve my requirement.

-- creating db

CREATE SCHEMA IF NOT EXISTS `allmarks` DEFAULT CHARACTER SET utf8 ;
USE `allmarks` ;

-- table schema as per csv file

CREATE TABLE IF NOT EXISTS Marks_2017 (
  `Name` VARCHAR(255) NOT NULL,
  `class` INT(2) NOT NULL,
  `Marks` JSON NOT NULL,
  UNIQUE INDEX `Marks_2017_index` (`Name` ASC, `class` ASC));

-- Paste file in the above output path SHOW VARIABLES LIKE "secure_file_priv";

-- importing csv_file data to table

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Marks_2017.csv' 
INTO TABLE Marks_2017 
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\''
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;

-- importing csv_file data to update table for updating master data

CREATE TEMPORARY TABLE Marks_2017_Update SELECT * FROM Marks_2017 WHERE 1=0; -- where 1=0 will drop all the existing indexes

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Marks_2017_Update.csv' 
INTO TABLE Marks_2017_Update 
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\''
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;
makhthum syed
  • 195
  • 1
  • 2
  • 10

0 Answers0