Загрузка данных локального файла на основе выбора внешнего ключа - PullRequest
0 голосов
/ 11 июня 2018

Я ищу, чтобы вставить данные в таблицу на основе поиска внешнего ключа из локального файла данных, но я не уверен в синтаксисе.У меня есть список слов:

jamba
fire
street
road

в файле, который я хотел бы вставить в таблицу, используя

LOAD DATA LOCAL INFILE '$PATH'
    INTO TABLE b1 
    FIELDS TERMINATED BY '\n' 
    (SELECT id FROM dictionary
     WHERE dictionary.word='word-from-file');

Чтобы лучше описать проект: я пытаюсь создатьтаблица внешних ключей из словаря для размещения книги, например, использование номера словарной статьи вместо слов для заказа книги.

То есть: предложение The quick brown fox jumped over the lazy dog в таблице будет 1024 891 26 51 75 521 1024 762 1024 641 45(полностью догадываясь), но где каждое число является идентификатором для слова в словаре.

Первая таблица будет словарем:

Field    Type
id       word
word     varchar(128)

Вторая таблица будет книгой,b1:

Field    Type
pos      int   #Position of the word, essentially an id
wid      int   #A foreign key corresponding to a dictionary.word

Чувствительность к регистру имеет значение.Не делайте и не делайте это два разных слова.

По сути, я пытаюсь выполнить действие, описанное в этом ответе SO от @revo: Вставить mysql в id внешнего ключа php , но используяполя в локальном файле данных вместо отдельной таблицы.

Примечание. Чувствительность к регистру имеет значение!Я определил поле словарного слова на основе

CHARACTER SET utf8 COLLATE utf8_bin

Ответы [ 2 ]

0 голосов
/ 12 июня 2018
  1. LOAD новый список в дополнительной таблице, в которой есть дополнительный столбец для идентификатора, по умолчанию NULL.
  2. INSERT .. SELECT .. WHERE .. NULL для вставки любых новых слов в словарь.
  3. Выполните мульти-таблицу UPDATE, чтобы получить идентификаторы для всех слов.Это входит в дополнительный столбец.
  4. Продолжайте делать все, что вам нужно - например, скопировать данные (используя id вместо word) в другую таблицу.

Я вхожу более подробно здесь .

Между тем, убедитесь, что у вас есть те же COLLATION (например, utf8_bin) наword столбец во всех таблицах, где он существует.

Это должно быть достаточно быстрым для вашего приложения , если сопоставление соответствует и словарь имеет индекс по word.

Несоответствие параметров сортировки приводит к неиспользованию индекса, который будет ужасно медленным.

0 голосов
/ 11 июня 2018

Вы можете использовать предложение SET.Также позаботьтесь о ограничителях строки (\r\n в ОС Windows):

LOAD DATA LOCAL INFILE 'path-to-file' 
INTO TABLE `b1`
LINES TERMINATED BY '\n'
(@word)
SET `wid` = (SELECT `id` FROM `DICTINARY` `d` WHERE BINARY `d`.`word` = @word);
...