Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уникальный sub_id для id 
:(
    Опции темы
maxipub
Дата 29.6.2016, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Добрый день!

Думаю, у такой задачи есть некая терминология, но раз я о ней не знаю, то и не очень понимаю как назвать тему. Итак, дано:

Код
CREATE TABLE IF NOT EXISTS `my_1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `my_2` (
  `id` int(10) unsigned NOT NULL,
  `sub_id` int(10) unsigned NOT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


С первой таблицей все понятно. Туда (в теории smile) вставляются некие данные, СУБД сама назначает им инкрементальный уникальный id, все счастливы.

Нужно сделать так, чтобы в таблице my_2 поле sub_id для каждого конкретного id вело себя так, как сам my_1.id, можно ли такое сделать средствами MySQL?

Т.е. вставляем в пустую таблицу id=1, sub_id для этой строки автоматом устанавливается = 1, вставляем еще один id=1, sub_id устанавливается = 2, вставляем id=2 - sub_id=1, id=3 - sub_id=1, id=1 - sub_id = 3 и т.д...

Как часто бывает, пока писал вопрос, решение вроде бы нашлось само собой. Поменял структуру my_2 на такую:

Код
CREATE TABLE IF NOT EXISTS `my_2` (
  `id` int(10) unsigned NOT NULL,
  `sub_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`,`sub_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Вроде бы все работает как раз как надо. smile Вопрос - насколько такое решение корректно? smile 
PM MAIL   Вверх
Akina
Дата 29.6.2016, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  29.6.2016,  12:18 Найти цитируемый пост)
насколько такое решение корректно?

Ровно настолько, насколько это описывается документацией.
Цитата(http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html)

For MyISAM tables, you can specify AUTO_INCREMENT on a secondary column in a multiple-column index. In this case, the generated value for the AUTO_INCREMENT column is calculated as MAX(auto_increment_column) + 1 WHERE prefix=given-prefix. This is useful when you want to put data into ordered groups.
А всё остальное - от лукавого.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
igorold
Дата 29.6.2016, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



Правда есть одна тонкость:

Цитата

In this case (when the AUTO_INCREMENT column is part of a multiple-column index), AUTO_INCREMENT values are reused if you delete the row with the biggest AUTO_INCREMENT value in any group. This happens even for MyISAM tables, for which AUTO_INCREMENT values normally are not reused. 



--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Akina
Дата 29.6.2016, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Ну на самом деле там больше тонкостей...

К тому же неизвестен физический смысл этого sub_id - может, динамическая нумерация в пределах группы в запросе будет более правильным решением, чем статическое хранение этого дополнительного атрибута.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 29.6.2016, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, круто! smile 

igorold, спасибо что обратили внимание, это важно!

Добавлено через 40 секунд
Цитата(Akina @  29.6.2016,  16:23 Найти цитируемый пост)
динамическая нумерация в пределах группы в запросе будет более правильным решением

Это как?
PM MAIL   Вверх
Akina
Дата 29.6.2016, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  29.6.2016,  17:29 Найти цитируемый пост)
Это как? 

Это убрать вообще поле sub_id и считать его непосредственно в запросе. Типа
Код

mysql> SELECT * FROM test;
+----------+------+
| group_id | val  |
+----------+------+
|        1 |   11 |
|        1 |   10 |
|        3 |   11 |
|        2 |   11 |
|        3 |   12 |
|        1 |   17 |
|        2 |   17 |
|        2 |   10 |
|        1 |   16 |
+----------+------+
9 rows in set (0.07 sec)

mysql> select test.*,
    -> if(@counter=test.group_id, @rownum:=@rownum+1, @rownum:=1+least(0,@counter:=test.group_id)) AS num_in_group
    -> from test, (select @rownum:=1, @counter:='_') dummy
    -> order by group_id, val ASC;
+----------+------+--------------+
| group_id | val  | num_in_group |
+----------+------+--------------+
|        1 |   10 |            1 |
|        1 |   11 |            2 |
|        1 |   16 |            3 |
|        1 |   17 |            4 |
|        2 |   10 |            1 |
|        2 |   11 |            2 |
|        2 |   17 |            3 |
|        3 |   11 |            1 |
|        3 |   12 |            2 |
+----------+------+--------------+
9 rows in set (0.00 sec)



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 30.6.2016, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, спасибо, но лучше буду хранить, такой вариант для меня слишком навороченный. smile Да и значения sub_id будут использоваться в запросах по джойну и т.д., мне кажется проще будет работать с ним в явном виде.

А вот если расскажите еще про:

Цитата(Akina @  29.6.2016,  16:23 Найти цитируемый пост)
Ну на самом деле там больше тонкостей...


Буду крайне благодарен. Переделываю большой старый, а главное - работающий проект.

Там сейчас все частично на БД, частично на файлах. И вот эти sub_id на данный момент вообще хранятся сериализованном виде в php-инклудах. По большому плану я не сильно заморачиваюсь как все работает. Пусть разработчики не супер красиво реализовали его, но работает. Просто новый функционал который нужно допилить не удастся сделать без СУБД, иначе на каждый запрос надо будет инклудить все (сотни тысяч) этих php-инклудов, коллекционировать и сортировать в них инфу, в общем, это не вариант на файлах делать, надо переносить все это дело в БД. А на файлах там просто реализовано, один id - один id.php файл, данные - сериализованный php массив-список с добавление нового элемента как $_arr[] = $new;

Это сообщение отредактировал(а) maxipub - 30.6.2016, 10:32
PM MAIL   Вверх
Akina
Дата 30.6.2016, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  30.6.2016,  11:30 Найти цитируемый пост)
А вот если расскажите еще про:
Цитата(Akina @  29.6.2016,  17:23 Найти цитируемый пост)
Ну на самом деле там больше тонкостей...

Основное - жёсткая привязка к движку. Только MyISAM, безальтернативно. Со всеми следствиями этого факта.
Повторное использование - тоже неприятно, поскольку не обеспечивается уникальность в течение периода жизни таблицы, и возможно разрушение непротиворечивости данных.
И ещё там были какие-то заморочки (не помню, какие именно) при FK на этот индекс с каскадированием.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1212 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.