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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> триггеры не дружат с автоинкрементом 
:(
    Опции темы
PashaLost
Дата 21.5.2012, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день. Проектирую БД покерной статистики. Столкнулся со следующей проблемой: 
При добавлении в БД триггеров (просто объявляем их существование и описываем тело)
странные пируэты начинает вытворять автоинкремент.  
Опишу механизм действий: 
1 Создаём скелет БД (пустые таблицы InnoDB + связи). 
2 Наполняем БД первоначальными данными (т.н. справочники).
3 Добавляем в БД триггеры и пока их отключаем 
(именно в такой последовательности, сначала заполняем данные, потом триггеры)
4 Процедуры, функции, утилиты. 
Просматриваем справочники - в них всё красиво лежит.  
Включаем триггеры. 
Добавляем данные в справочник, триггер корректно срабатывает, но значение автоинкремента первичного ключа перепрыгивает предыдущее значение сразу вдвое( если было 2 - станет 4, было 4 - 8, 
было 10 - станет почемуто 16). Оно какбы не смертельно, но БД достаточно большая и хотелось бы 
деражать всё под контролем. 
В триггерах вызываются процедуры, а них активно используются курсоры. 
Весь прикол в том, что если в БД не добавлять триггеры на УДАЛЕНИЕ, то всё становится нормально.
Замедте! Используем то мы триггеры на добавление.  Вот такая каша. Может кто в курсе что происходит ? 
И ещё вопрос ... Существует ли возможность запустка SOURCE сразу пакетов sql файлов, причём в них указывать как просто SQL так и создание хранимых процедур и функций (на первой же хранимой процедуре кидает ошибку на синтаксис, хотя если просто скопипастить с СМД всё гуд) 

среда разработки NotePad++  и CMD



Это сообщение отредактировал(а) PashaLost - 21.5.2012, 00:20
PM MAIL   Вверх
Akina
Дата 21.5.2012, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



PashaLost, позвольте полюбопытчтвовать - а что собственно не нравится? автоинкремент обеспечил уникальность значений для каждой записи? всё, он выполнил то, что должен был. Ключ-автоинкремент существует только для организации связи между таблицами и поддержания целостности и непротиворечивости. Пользователю (в т.ч. разработчику) совать нос в его значения совершенно незачем.

А если нужно поле, где будут идти "номера по порядку" - заведите отдельное поле bigint, и заполняйте его из того же триггера.


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

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


Новичок



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

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



не нравится собственно то, что автоинкремент типа тиниинт  (а это важно, нельзя использовать к примеру смолинт, т.к. ключ используется в другой таблице, которая имеет много записей, и объём данных при переходе с тини на смол резко увеличится), и если он вдруг переполнится, сами понимаете что. Если он будет так после каждого ДЕЛИТ ИНСЕРТА удваиваться, что тогда ? 

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


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


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

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



Цитата(PashaLost @  21.5.2012,  15:57 Найти цитируемый пост)
если он вдруг переполнится, сами понимаете что

Нет, не понимаю. Если имеются ТАКИЕ ограничения - какие доводы привёл архитектор к тому, чтобы сделать данное поле автоинкрементным? Оно должно быть только уникальным и без-нулл-овым. А заполнение его неповторяющимися значениями должен обеспечить триггер. 
Я считаю, что это - ошибка проектирования.


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

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

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



Цитата(PashaLost @  21.5.2012,  14:57 Найти цитируемый пост)
Если он будет так после каждого ДЕЛИТ ИНСЕРТА удваиваться, что тогда ? 

Автоинкрементные значения обычно не предусматривают удаление.
Вы конечно можете после каждого удаления делать http://dev.mysql.com/doc/refman/5.0/en/alter-table.html и менять текущее состояние автоинкремента.
Но гарантии что все будет работать правильно - нет.

Откровенно говоря не понятен смысл всех телодвижений.
Можно чуть подробнее описать стоящую задачу?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
PashaLost
Дата 21.5.2012, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я не удаляю автоинкрементные значения smile я удаляю записи из таблици. Думаю можно закрывать дискуссию, данный эффект проявляется лишь однажды - при инсталляции триггеров, можно на это закрыть глаза. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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