Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   MySQL вопроса тред (https://javascript.ru/forum/offtopic/55505-mysql-voprosa-tred.html)

UIjs 30.04.2015 22:48

MySQL вопроса тред
 
подскажите как провернуть такое что мол инкримент только средствами языка sql. есть такое INT поле "номер счета" и нужно чтобы оно автоматом увеличивалось на один допустим. я хочу это сделать на уровне sql через default value

TABLE ololo(
name INT DEFAULT (select max(*) as...)+1
)

ну то есть типа того, короче как инкриментировать обычное поле которое не ключ

laimas 01.05.2015 08:40

Зачем же номер счета делать полем не уникальным и без авто инкремента?

UIjs 01.05.2015 19:16

laimas, потому что инкримент можно поставить только на PK а а он стоит естественно на id, а id система исопльзует для своих внутренних нужд. так же номер счета должен отличаться от id

Makarov 01.05.2015 19:33

Цитата:

инкримент можно поставить только на PK
На непервичный ключ тоже вроде можно автоинкремент вешать

laimas 01.05.2015 20:33

Цитата:

Сообщение от Makarov (Сообщение 369000)
На непервичный ключ тоже вроде можно автоинкремент вешать

На уникальный можно, а но в двух полей с автоикрементом в таблице не может быть, как и первичного с уникальным.

laimas 01.05.2015 20:37

UIjs, сперва надо понять что первично, курица или яйцо )
Что такое номер счета, счета чего? Почему потребовался номер по порядку? Это просто порядок или же уникальность?

Gozar 01.05.2015 20:41

Ну, можно создать таблицу ORDERS и получить оттуда уникальные значения. Ну, будет в ней 1 столбец counter с аuto_increment-om и всё.

Тыркаем в ORDERS, получили уник-автоинкремент, вставили в основную таблицу ololo у которого свой автоинкремент.

Gozar 01.05.2015 20:44

В OrientDB например нет autoincrementa в привычном понимании. Зато есть такой, как я описал выше.

UIjs 01.05.2015 21:44

Gozar, ух ты хитрый)), ха) костыль конечно но работать будет. ладно, запилю в двигле автоинкриментацию или какую нить функцию на mysqk нафурычу. в принципе можно простым селектом делать типа считать максимальное значение и бла бла бла и подставлять в другой селект. но проще этио пыхой делать. храня где то таблицу последних значений максимальных кастомных инкриментов просто. и все.

ладно

Gozar 01.05.2015 22:25

Цитата:

Сообщение от UIjs
костыль конечно

Для мускуля, возможно. Там много костылей :)

laimas 01.05.2015 22:33

Цитата:

Сообщение от Gozar (Сообщение 369008)
Ну, можно создать таблицу ORDERS и получить оттуда уникальные значения. Ну, будет в ней 1 столбец counter с аuto_increment-om и всё.

Тыркаем в ORDERS, получили уник-автоинкремент, вставили в основную таблицу ololo у которого свой автоинкремент.

А не проще ли создать поле в таблице, а не таблицу, и которое будет при записи автоматом увеличиваться на единицу?

Если счет, это счет к примеру заказа, и его нужно хранить наряду еще с какой либо инфой, то это таблица с первичным ключом и автоикрементом, и полем указывающем на родителя-заказ. Если же уникальность не нужна, и счет храниться в таблице заказов, значит просто поле с добавлением 1, и для этого совсем не нужно не DEFAULT значений получать, ни прочих "костылей".

Gozar 01.05.2015 23:01

Цитата:

Сообщение от laimas
А не проще

То, что проще, не всегда надёжней.

Цитата:

Сообщение от laimas
автоматом увеличиваться на единицу?

про то и тема ;) Каким автоматом ты предлагаешь увеличивать на единицу если первичный ключ занят, а 2 автоинкремента в таблице нет и max не устраивает?

Цитата:

Сообщение от laimas
родителя-заказ.

Ничего не понял, кто чей родитель?

Речь про автоинкремент, а не про добавление единиц... Таким способом очень легко наступить на какие-нибудь феерические грабли.

laimas 01.05.2015 23:10

То, что проще, не всегда надёжней.

Ну да, городить лишнее это куда надежнее )

Каким автоматом ты предлагаешь увеличивать на единицу если первичный ключ занят, а 2 автоинкремента в таблице нет и max не устраивает?

Индивидуальную сортировку когда либо приходилось делать или рассказывать как это делается?

Ничего не понял, кто чей родитель?

А счет это что, сам по себе или же он кому-то принадлежит? Заказ, это лишь пример.

Речь про автоинкремент, а не про добавление единиц... Таким способом очень легко наступить на какие-нибудь феерические грабли.

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

Gozar 01.05.2015 23:23

laimas,
У тебя с русским языком проблема?
Цитата:

Сообщение от UIjs
как провернуть такое что мол инкримент только средствами языка sql, есть такое INT поле "номер счета" и нужно чтобы оно автоматом увеличивалось на один допустим. я хочу это сделать на уровне sql через default value


UIjs 02.05.2015 01:01

Цитата:

Сообщение от laimas
Из вопроса не следует, что требуется уникальность

следует

Цитата:

Сообщение от laimas
возможно он и нужен.

Цитата:

Сообщение от UIjs
поле "номер счета"

Цитата:

Сообщение от laimas
нет данных, что это и для каких целей.

бывает)

laimas 02.05.2015 06:56

Gozar,
нет проблем с этим, а вот у вас обеих видимо есть. )

Ибо на нет данных, что это и для каких целей. - бывает).

А увеличить, это порядок, количество уникальность для самого счета. И если этот вопрос гвоздь преткновения, то делайте костыли. Хотя выпендриваться так, как вы вдвоем рассуждаете, совсем не обязательно, получить макс. значение поля плюс единица знаете, не сложно.
А по уму, так это первичным должен быть вопрос - кто хозяин.

UIjs 02.05.2015 08:30

Цитата:

Сообщение от laimas
обеих

так мы ж не девушки, почему ты говоришь "обеих" ?

laimas 02.05.2015 10:32

Так кто же вас знает
Кого скрывают платья не понять
Брут или не Брут
Вот в чем вопрос

:)

UIjs 02.05.2015 10:37

laimas, ты не ответил на мой вопрос. ты просто ответил на реплику в диалоге но на вопрос не ответил.

laimas 02.05.2015 11:54

Какой вопрос, по поводу пола?

UIjs 02.05.2015 13:46

да. у тя пукан возгарелся что все поняли а ты затупил и ты решил нас обозвать? типа бабы хуже парней а ты сделал вид что мы бабы зная что мы парни тем самым принизил нас и типа от этого не считается что ты тупану? такая у тебя логика была? типа, да, я тупанул, ну а вы, А ВЫ, А МЫ НЕ МУЖЧИНЫ, ВЫ ЖЕНЬЩИНЫ!! АХ!! СЬЕЛИ?*?? ахахааха, я очистился!! моя тупость анулировалась я перекрыл её оскорблением! 1:1 ураа ураа. такая логика?

laimas 02.05.2015 18:23

Да уж, бурная логика, не у меня правда, успокойтесь, никто вас за "баб" не считает, да и женщина, это не обязательно штамп "блондинка". :)
А что я "типа рассуждал", ну так само формирование этого числа, это простая операция и не требующая наворотов, а возможно, что и подход не верный, и лучше бы оно и формировалось автоматически. Не известно, что из себя представляет вся операция "формировать счет", при каких условиях, а это может быть важным моментом. А не зная это, ну что я буду рассуждать то, да и некогда сейчас, работы много )

UIjs 02.05.2015 18:53

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

Vlasenko Fedor 02.05.2015 20:37

UIjs,
Пишешь тригер AFTER INSERT, в тригере выбираешь максимальное значение поля в таблице добавляешь к нему 1 и обновляешь только, что вставленную запись

UIjs 02.05.2015 21:31

Poznakomlus, красавчик, а нельзя ли вытворить такое:

типа того: INSERT INTO `table`(`field`) VALUES( MAX(`field`)+1 )

Vlasenko Fedor 02.05.2015 21:41

Можно и так я предложил переложить логику на MySql. Можно еще вьюху (представление) создать чтобы отображала MAX значение и выбирать из нее значение MAX. Вариантов много

UIjs 02.05.2015 21:48

Poznakomlus, не, я мой ваирант кстати рабочий? есть какая нить такая функция? подскажи как запрос сделать)? или я уже ТУПО УГАДАЛ)??

Vlasenko Fedor 02.05.2015 22:01

INSERT INTO `table`(`val`) VALUES ((SELECT MAX(`val`) FROM `table` as tbl) + 1) ;
к примеру так

UIjs 02.05.2015 22:02

а есть че нить типа

`field` INT DEFAULT MAX(`field`)+1

?

Vlasenko Fedor 02.05.2015 22:11

это легко делается тригером
тригер срабатывает после вставки и сам заменит новое значение
1. Вариант вставка с подзапросом
2. Вариант сделать вьюху с отображением max/ Она будет в памяти вычисляться и будет летать.
3. Вариант это тригер
4 Вариант тригер с вьюхой самое скоростное будет
При небольших объемах любой сойдет если поле индексированным сделаешь то пофиг какой объем
Вариант 4 самый высокопроизводительный. И не забудь к этому полю индекс поставить

UIjs 02.05.2015 22:17

Poznakomlus, в принципе триггер красивее смотрится и надежнее, ты прав) спасибо огромное.


Часовой пояс GMT +3, время: 15:36.