Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
Ответ наверное лежит на поверхности, но найти для себя я не могу. Ниже указал кусок из документации по auto increment, все в целом хорошо, но у меня возник вопрос, как при такой индексации можно вернуть уникальное значение id, не лишаясь конечно составного. CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id; Which returns: +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:22 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
Вопрос совершенно непонятен. systistratorкак при такой индексации можно вернуть уникальное значение id, не лишаясь конечно составного.При такой структуре id НЕ УНИКАЛЕН . Уникален первичный ключ (grp,id). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:36 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
Вопрос в целом в том, как при такой конструкции получить уникальный код записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:49 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
Если нужен синтетический уникальный ID и нумерация внутри группы - делай две таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 08:51 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
AkinaЕсли нужен синтетический уникальный ID и нумерация внутри группы - делай две таблицы: а что в mysql ограничение на кол-во auto-колонок в одной таблице? так то можно просто id2-колонку сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 12:43 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
tip78а что в mysql ограничение на кол-во auto-колонок в одной таблице? А разве нет? There can be only one AUTO_INCREMENT column per table, it must be indexed, and it cannot have a DEFAULT value Даже в свежей восьмёрке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 13:29 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
хм, не предусмотрели пж вот предусмотрел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 14:33 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
Учитывая, что в проекте таких групповых идентификаторов в рамках таблиц будет много решил воспользоваться своим опытам VFP... Да и если честно не хотелось бы использовать MyISAM. 1. Создать таблицу инкрементов Код: sql 1. 2. 3. 4. 5. 6. 2. Написать функцию MySQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ответ MySQL: Документация #1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около 'SET cur_var = 1; ELSE UPDATE b_inc SET inc = cur_var + 1 WHERE id_tbl = ID_VAR' на строке 7 *************** 3. Создать триггер в таблице, который бы вызывал функцию и записывал искомое значение Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ошибка Ответ MySQL: Документация #1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около '; NEW.id_grp = @inc; END' на строке 3 Но вот незадача..., убил весь день в этих 10 строчках, но так и не понял по какой причине ошибки... И вообще на сколько такое решение имеет право на существование, с чем я могу столкнуться? Большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 13:06 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
там может SELECT INTO @inc какой-нить есть в PG так: SELECT * INTO myrec FROM tbl WHERE id = 1; да разломайте вы свой недоиндекс "PRIMARY KEY (grp,id)" и сделайте 1 - по ID во1, grp + id должен быть id + grp, потому что уникальных ID куда больше, чем grp. Т.е. по grp он найдёт триллионы ID, по которым ему снова искать. А вот если по ID, то всего 3 группы. во2, вам вообще индекс на grp не нужен, потому что их всего 3 будет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 13:35 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
циферки подсчёта в каждой группе можно при селекте выводить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 13:44 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
systistrator2. Написать функцию MySQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ответ MySQL: Документация #1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около 'SET cur_var = 1; ELSE UPDATE b_inc SET inc = cur_var + 1 WHERE id_tbl = ID_VAR' на строке 7 Пропущена точка с запятой в предыдущем операторе INSERT INTO. systistrator3. Создать триггер в таблице, который бы вызывал функцию и записывал искомое значение Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ошибка Ответ MySQL: Документация #1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около '; NEW.id_grp = @inc; END' на строке 3 Используйте для присвоения значения переменной из запроса не SET, а SELECT .. INTO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 13:57 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
AkinaИспользуйте для присвоения значения переменной из запроса не SET, а SELECT .. INTO.Впрочем, в данном конкретном случае можно использовать прямое присвоение, без всяких SELECT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 14:00 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
tip78циферки подсчёта в каждой группе можно при селекте выводить Задача иная, мне нужен не подсчет строк, а именно инкремент в рамках определенного ключи. А при простом подсчете соответственно не будут учтены удаленные записи. tip78да разломайте вы свой недоиндекс "PRIMARY KEY (grp,id)" и сделайте 1 - по ID Да я его уже разломал... :)) Та, схема которую я сегодня пытаюсь победить сделана на InnoDB. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В целом смысл в том, что есть таблица документов, в таблице есть _to (офис) и _year (год), у каждого офиса в рамках года должна быть своя нумерация. Сразу скажу, что создавать для каждого офиса свою таблицу не вариант, конечно конкретно в этом случае это можно было бы сделать (пришлось бы каждый год создавать 36 новых таблиц), но в рамках этого же проекта есть схожая задача, так там мне придется создавать 36*X (Х неизвестен) таблиц каждый день, да ещё в определенное время суток, в зависимости от часового пояса. Вообщем ищу более простой способ )) AkinaПропущена точка с запятой в предыдущем операторе INSERT INTO. Низкий поклон! Постараюсь быть внимательнее... Проверял все на 10 раз и такая оплошность... Поправил, получилось :)) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. mysql> select setAutoInc('02'); +------------------+ | setAutoInc('02') | +------------------+ | 4 | +------------------+ 1 row in set (0.03 sec) А вот с триггером у меня что-то плохо... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Не через SELECT ... INTO, ни через SET не могу запустить. Пишет: Ответ MySQL: Документация #1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около '.id_grp = inc; END' на строке 6 Ну и вообще такая схема имеет права на существование? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 16:09 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
systistratortip78циферки подсчёта в каждой группе можно при селекте выводить Задача иная, мне нужен не подсчет строк, а именно инкремент в рамках определенного ключи. А при простом подсчете соответственно не будут учтены удаленные записи. а для этого логи надо вести ;) `_year` int(4) NOT NULL, под год сгодится и tinyint unsigned ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 17:25 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
systistratorА вот с триггером у меня что-то плохо... что за дичь, почему вот так то нельзя? Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 17:31 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
Сделал так, работает: Код: sql 1. 2. 3. 4. 5. 6. 7. что не так с Код: sql 1. понять не могу... mysql> select * from b_inc; Empty set (0.00 sec) mysql> insert into b (_to,_year,name) values (1,2018,'123') -> ; Query OK, 1 row affected (0.03 sec) mysql> insert into b (_to,_year,name) values (1,2018,'123'); Query OK, 1 row affected (0.04 sec) mysql> select * from b_inc; +----+----------+-----+ | id | id_tbl | inc | +----+----------+-----+ | 7 | B#1#2018 | 2 | +----+----------+-----+ 1 row in set (0.00 sec) tip78что за дичь, почему вот так то нельзя? Код: sql 1. Хм..., сказать честно, может и можно ))) Не ищу я легких путей... ))) За совет большое спасибо! А не может ли получиться так, что при вставлении записи будет удалена последняя запись и вставляемая получит его ID? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 17:46 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
systistratorХм..., сказать честно, может и можно ))) Не ищу я легких путей... ))) За совет большое спасибо! А не может ли получиться так, что при вставлении записи будет удалена последняя запись и вставляемая получит его ID? ну у вас там написано AFTER INSERT, я от этого и пляшу давайте спляшем от другого тогда - а зачем вам эти дыры в записях?? Вы даже не будете знать "а что там было". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 18:23 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
tip78Вы даже не будете знать "а что там было". Нет, знать, что там было я знать все равно буду, т.к. будет ещё журналирование событий. Но в целом думаю ваш вариант для меня вполне подходит, просто буду не удалять записи а введу поле _del и буду помечать при необходимости. Большое вам спасибо! Но что не так с триггером мне все равно интересно, для опыта пригодится ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 02:19 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
systistratorНет, знать, что там было я знать все равно буду, т.к. будет ещё журналирование событий. ну так тем более они вообще нафиг не нужны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 04:22 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
tip78systistratorНет, знать, что там было я знать все равно буду, т.к. будет ещё журналирование событий. ну так тем более они вообще нафиг не нужны Дело в том, что недопустимо если будет существовать два документа с одним номером... Засудят... Я так понял, нельзя при insert делать select к этой же таблице INSERT INTO b (`id_to`,`_year`,`name`,`id_grp`) VALUES (33,2017,"1",(SELECT (max(id_grp) + 1) AS cnt FROM b WHERE id_to = 33 AND _year = 2017)) Ответ MySQL: #1093 - Не допускается указание таблицы 'b' в списке таблиц FROM для внесения в нее изменений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 05:00 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
systistratortip78пропущено... ну так тем более они вообще нафиг не нужны Дело в том, что недопустимо если будет существовать два документа с одним номером... Засудят... так у вас ID есть с автоинкрементом, он всегда поставит следующий № если удалите 32, то следующий всё-равно будет 33, последовательность помнит. Я так понял, нельзя при insert делать select к этой же таблице INSERT INTO b (`id_to`,`_year`,`name`,`id_grp`) VALUES (33,2017,"1",(SELECT (max(id_grp) + 1) AS cnt FROM b WHERE id_to = 33 AND _year = 2017)) Ответ MySQL: #1093 - Не допускается указание таблицы 'b' в списке таблиц FROM для внесения в нее изменений lol в пг можно ну сделайте отдельно селект ДО insert ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 06:20 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
но вообще вам это в новой парадигме не нужно совершенно при селекте выведете эти цифры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 08:58 |
|
||
|
Вопрос по инкременту в MyISAM
|
|||
|---|---|---|---|
|
#18+
В целом я наконец-то нашел недочет в триггере... )) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: sql 1. Query OK, 1 row affected (0.02 sec) Код: sql 1. Query OK, 1 row affected (0.03 sec) Код: sql 1. Query OK, 1 row affected (0.01 sec) Код: sql 1. Query OK, 1 row affected (0.02 sec) Код: sql 1. Query OK, 1 row affected (0.03 sec) Код: sql 1. Query OK, 1 row affected (0.03 sec) Код: sql 1. +----+--------+-----+-------+------+ | id | id_grp | _to | _year | name | +----+--------+-----+-------+------+ | 51 | 1 | 1 | 2017 | 1 | | 52 | 2 | 1 | 2017 | 2 | | 53 | 3 | 1 | 2017 | 3 | | 54 | 1 | 1 | 2018 | 4 | | 55 | 2 | 1 | 2018 | 5 | | 56 | 1 | 2 | 2017 | 6 | +----+--------+-----+-------+------+ 6 rows in set (0.00 sec) Код: sql 1. +----+----------+-----+ | id | id_tbl | inc | +----+----------+-----+ | 23 | B#1#2017 | 3 | | 24 | B#1#2018 | 2 | | 25 | B#2#2017 | 1 | +----+----------+-----+ 3 rows in set (0.00 sec) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 16:13 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39637807&tid=1829884]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 383ms |

| 0 / 0 |
