Перейти к содержимому


Фотография

Вопросы по mysql 5.5


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 16

#1 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 15.07.2013 - 21:31

Так, у меня беда. Я сделал базу данных листоедов, содержащихся в энтомологических коллекциях, в mysql. И теперь я страдаю от того, что пытаюсь одну таблицу разделить на несколько.

Таблица содержит следующие данные: название вида, этикетка (географический район), ориентир, долгота, широта, месяц, год, имя коллекционера или название музея.

В силу логики было решено разделить эту таблицу на три и соединить их ключами. Одна таблица - данные, другая - виды, третья - коллекции. Таблица данные связана через ID с таблицами виды и коллекции.

И вот как я ни схожу с ума, я не понимаю, как это сделать. Данные сами вставил, а вот как теперь перенести соответствующие ID?

Сами названия видов и имена коллекционеров уже перенесены в соответствующие таблицы, и они обзавелись своими идентификаторами.

 

КРАТКО Вот у меня есть один вид листоеда в таблице "ВИДЫ"- к нему (этому виду) относится несколько строк из таблицы "ДАННЫЕ". Как сделать так, чтобы каждая из этих строк содержала идентификатор соответствующего вида?

С командой UPDATE я уже немного знаком - она меня просто убивает, честно говоря. Если нужно использовать её, объясните как, пожалуйста.


Сообщение отредактировал frim_ax: 15.07.2013 - 21:33

  • 0

#2 sugarfree

sugarfree

    Участник

  • Забаненные
  • 846 сообщений
  • 593 благодарностей
  • Город:Прага
  • Настроение: *

Отправлено 15.07.2013 - 22:05

если данных ещё не много то я бы к "видам" приделал столбец "идентификатор" и вручную прилепил каждому листоеду его идентификатор
ALTER TABLE данные ADD COLUMN идентификатор CHAR(10) NULL
потом повторять
UPDATE данные SET идентификатор = `нужный идентификатор` WHERE листоед= `листоед которому лепим идентификатор`

 

блин чето аватарка не удаляется



Поблагодарили 1 Пользователь:
Just In

#3 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 15.07.2013 - 22:06

500 с чем-то видов, 4000 с чем-то всего строк.


  • 0

#4 sugarfree

sugarfree

    Участник

  • Забаненные
  • 846 сообщений
  • 593 благодарностей
  • Город:Прага
  • Настроение: *

Отправлено 15.07.2013 - 22:08

:crazy-1: тогда не знаю 



#5 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 15.07.2013 - 22:10

на этом языке подобное предусмотрено? может, через php лучше?


  • 0

#6 sugarfree

sugarfree

    Участник

  • Забаненные
  • 846 сообщений
  • 593 благодарностей
  • Город:Прага
  • Настроение: *

Отправлено 15.07.2013 - 22:16

если t-sql то предусмотрено можно к примеру условно взять за идентификатор числа и в фор цикле прокрутить 


Поблагодарили 1 Пользователь:
frim_ax

#7 Just In

Just In

    ~

  • Участник
  • 1 535 сообщений
  • 895 благодарностей
  • Настроение: *

Отправлено 15.07.2013 - 22:21

Таблица содержит следующие данные: название вида, этикетка (географический район), ориентир, долгота, широта, месяц, год, имя коллекционера или название музея.

 

Одна таблица - данные, другая - виды, третья - коллекции.

 

 

 

 

 

И таблица «данные» и таблица «виды» обе содержат столбец «название вида», так? (хотя столбцы могут и по-разному называться). Вот через этот столбец и связывать при выводе циклом..

 

(вариант при котором ничего апдейтить перезаписывать ненужно)


Сообщение отредактировал Just In: 15.07.2013 - 22:42

  • 0

Поблагодарили 1 Пользователь:
frim_ax

#8 PantheR

PantheR

    Maleficarum

  • Root admin
  • 1 285 сообщений
  • 284 благодарностей
  • Настроение: *

Отправлено 15.07.2013 - 22:39

Хм... получается что у тебя сейчас в базовой таблице информация о видах и коллекция хранится как строка? По идее грамотное хранение подразумевает что ты выделяешь часто повторяющуюся информацию в отдельные таблицы (как я понял уже сделано) и заменяешь в данных строковую информацию на ID - в этом случае должен измениться формат самого поля со строкового на числовой.

Вопрос такой, что с этой базой работает?

Ты хочешь замену автоматизировать? Если да, то тебе нужно создать новую колонку целочисленную для хранения ID (старую использовать муторно)и путем запроса с объединением таблиц сопоставить данные в таблице Данных и остальных таблицах (ориентируясь на строковое значение и получая ID который будет записан в новую колонку). В принципе попахивает TSQL но возможно решается обычным запросом.

 

Вот похоже то что нужно:

UPDATE data
    INNER JOIN vidi
        ON data.vid_name = vidi.name
    INNER JOIN collections
        ON data.collections_name= collections.name
    SET data.vid_id = vidi.id, data.collection_id = collections.id 

Где vid_id и collection_id новые колонки в таблице данных. А vidi и collections - соответствующие таблицы.
 


ЗЫ! Соответственно строковые поля vid_name и collections.name потом удаляются за ненадобностью



Поблагодарили 4 Пользователи:
Lilit , sugarfree , Just In , frim_ax

#9 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 15.07.2013 - 23:00

Попробовал, долго выполняется, не дождался. Разбил запрос на два - прекрасно.

Всё получилось, спасибо :).


Сообщение отредактировал frim_ax: 15.07.2013 - 23:09

  • 0

#10 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 04.08.2013 - 20:14

В таблице "Данные" всего 4700 примерно записей. Сейчас заметил, что при добавление с помощью insert новых - id начинается с 8192 (дальше 8193 и т.д.). Если добавлять в таблицу "коллекции", где 55 записей, то id новых записей идёт с 64. Т.е. число - степень двойки. Никаких манипуляций с auto_increment не делал. В чём дело?

last_insert_id() всё время показывает 1, пока не вставлю новую запись, а потом сразу 8192.


  • -1

#11 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 14.08.2013 - 21:15

Это какой-то плохой вопрос что ли? Не понимаю.

Давайте поясню, может. Вот есть файл - там все данные. Есть скрипт, который делает базу данных. Пока перекачивает из файла в базу, перетасовывает данные по таблицам, - всё нормально. А когда я добавляю ещё новые, вручную, - id сбивается на число кратное двум.


Сообщение отредактировал frim_ax: 14.08.2013 - 21:16

  • 0

#12 PantheR

PantheR

    Maleficarum

  • Root admin
  • 1 285 сообщений
  • 284 благодарностей
  • Настроение: *

Отправлено 16.08.2013 - 12:04


В таблице "Данные" всего 4700 примерно записей. Сейчас заметил, что при добавление с помощью insert новых - id начинается с 8192 (дальше 8193 и т.д.). Если добавлять в таблицу "коллекции", где 55 записей, то id новых записей идёт с 64. Т.е. число - степень двойки. Никаких манипуляций с auto_increment не делал. В чём дело? last_insert_id() всё время показывает 1, пока не вставлю новую запись, а потом сразу 8192.

last_insert_id() для того и нужен чтобы показывать или возвращать id последней вставленной записи. Если вставок в текущей сессии еще не было то и вернет 1.

 

Вообще idшники сами должны нормально обрабатываться, так что не шибко важно кто что и сколько инкрементирует :) Если инкремент новой записи идет на 2:

https://dev.mysql.co...ement_increment



#13 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 16.08.2013 - 19:04

Да нет. Я каждый раз заново базу данных формирую. Т.е. вот сделал insert 4000 записей - все id нормальные, заканчивается, скажем, на 4732, а last_insert_id 1 (что не соответствует реальности). А потом, тут же я вставляю ещё одну запись и сразу 8192, следующая 8193. И last insert id показывает именно эти значения. Я читал про эти две переменные, но они не объясняют, в чём дело, конечно же.

Я думал, что должно происходить так: есть последний id, следующий всегда на auto_increment_increment больше и для этого ничего дополнительно делать не нужно. Или всё же что-то нужно ещё делать, где-то сохранять id?


  • 0

#14 PantheR

PantheR

    Maleficarum

  • Root admin
  • 1 285 сообщений
  • 284 благодарностей
  • Настроение: *

Отправлено 16.08.2013 - 23:23

last_insert_id может срабатывать только если ты дал предварительно запрос с одной командой insert. Если ты запихнул туда batch с 4 тысячами команд - может не отработать.
Вообще схема автоинкремента в БД устроена так, чтобы каждую новую запись оформлять по внутреннему счетчику, независимо от вакантных номеров. Например добавил 4 тысячи записей, удалил, а новые будут уже с 4001 начинаться (пока не создашь новую БД или не сбросишь счетчик вручную на пустой БД). Вообще c id в большинстве случаев заморачиваться не стоит, по факту это внутренний номер в хранилище и все. Пусть хоть миллиардами хранит.

#15 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 16.08.2013 - 23:36

 

Вообще c id в большинстве случаев заморачиваться не стоит

:) Ну окей тогда. Хотя там не batch,а просто сначала из файла в базу данных загружается всё в одну таблицу, а потом с помощью команд insert и update всё раскидывается по другим таблицам, как уже говорилось.

Сами-то данные висят в Интернете в виде html таблицы на одной странице все вместе. Я их выделил, сохранил в блокноте, теперь мурыжу, стараясь придать им интерактивность.


Сообщение отредактировал frim_ax: 16.08.2013 - 23:40

  • 0

#16 Just In

Just In

    ~

  • Участник
  • 1 535 сообщений
  • 895 благодарностей
  • Настроение: *

Отправлено 17.08.2013 - 00:11

Сами-то данные висят в Интернете в виде html таблицы на одной странице все вместе.

 

 

а ссылку?

 

глюки с ластинсертидэ думается могут быть из-за того, что в коде что-то не так с последовательностью действий, то есть нужно поставить этот ластинсерт на шаг в перед или назад, в логической цепочке. Или дело в том что там инсерт массово циклом делается, а last_insert_id применим только к одной последней операции...  (сам не кодил в php уже года 3)


Сообщение отредактировал Just In: 17.08.2013 - 00:15

  • 0

#17 frim_ax

frim_ax

    Жить здесь остался

  • Участник
  • 7 862 сообщений
  • 1156 благодарностей
  • Город:Москва

Отправлено 17.08.2013 - 08:36

http://zin.ru/Animal...us/benkat11.htm

Только грузиться будет минут 15 страница эта, я сам на неё уже год как не заходил.

Вот кусок кода конкретный, где last_insert_id получается 1.

INSERT INTO longnames (completename) SELECT DISTINCT species FROM ChrMap;

select last_insert_id();

Т.е. тут вставляется 500 с чем-то разных видов из таблицы "карта листоедов" в таблицу "длиные имена".


Сообщение отредактировал frim_ax: 17.08.2013 - 08:38

  • 0




0 человек просматривают этот форум

0 пользователей, 0 гостей, 0 скрытых пользователей