SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.01.2012 23:21:24

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Не знаю как составить триггер

Не могу разобраться в триггерах, может кто-нибудь написать пример триггера "Если количество строк в таблице стало 1.000.000, создать рядом новую со след. порядковым номером, и сюда больше записи не принимать"?


Скажи миру - НЯ!

Неактивен

 

#2 28.01.2012 23:35:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не знаю как составить триггер

В триггере нельзя создать новую таблицу.

Неактивен

 

#3 28.01.2012 23:59:56

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

А переместить или переименовать?


Скажи миру - НЯ!

Неактивен

 

#4 29.01.2012 00:07:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не знаю как составить триггер

Нет.

Неактивен

 

#5 30.01.2012 03:42:57

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

А заблокировать?
Просто надо, чтоб было не больше скажем 1.000.000 записей.
Начала писать, через show table status  могу по auto increment  проверить набралось ли уже, но вот проблема, там может быть 999.998, пока проверяю, пока отсылаю, а там уже до меня навысылали, и мне придёт auto increment 1.000.015 хотя он уже должен быть в другой таблице. А нельзя ли проверку запихнуть в сам запрос записи? Так, чтоб если не прошло, можно было бы дальше плясать, создавать из ПХП уже следующию...


Скажи миру - НЯ!

Неактивен

 

#6 30.01.2012 21:25:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не знаю как составить триггер

По-моему, Вы изобретаете партиционирование.

Неактивен

 

#7 30.01.2012 23:51:51

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

Здраствуйте Paulus, ну да, как и пару месяцев назад, я занята всё тем же )
Не подскажете, как грамотней сделать так, что бы в таблице был максимум ровно один миллион записей?


Скажи миру - НЯ!

Неактивен

 

#8 31.01.2012 13:58:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не знаю как составить триггер

Сделайте партиционирование по id на сто разделов по миллиону значений?

Неактивен

 

#9 31.01.2012 14:00:55

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

А можно ещё раз написанное, но простым языком? roll


Скажи миру - НЯ!

Неактивен

 

#10 31.01.2012 14:37:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не знаю как составить триггер

Неактивен

 

#11 31.01.2012 19:06:41

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

Так ведь это партицирование файлов или?


Скажи миру - НЯ!

Неактивен

 

#12 31.01.2012 21:38:03

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Не знаю как составить триггер

Ну, на уровне ФС - вроде того.
Но на уровне работы с базой данных это не так важно. С точки зрения написания SQL-запросов все это остается одной таблицей (в чем и прелесть партиционирования; бывает важно помнить, что данные разбиты по разделам - но это уже с точки зрения оптимизации производительности).

Неактивен

 

#13 01.02.2012 04:14:37

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

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


Скажи миру - НЯ!

Неактивен

 

#14 01.02.2012 04:32:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не знаю как составить триггер

Триггером вы такое точно не сделаете.

Допустимо чтобы таблица временно превышала 1 млн записей? Тогда вы можете периодически (например с помощью event) делать проверку и если записей больше, то 1 млн записей переносится в новую таблицу.
В этом случае основную таблицу (в которую идет запись) можно и не переименовывать.

Неактивен

 

#15 01.02.2012 04:36:03

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

Нет, нельзя. При достижении лимита, надо создать новую таблицу и поставить auto_inrement = номмертаблицы*1.000.000+1


Скажи миру - НЯ!

Неактивен

 

#16 01.02.2012 08:00:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не знаю как составить триггер

У каждой задачи есть свой смысл. Ваша задача по описанию — партиционирование.

Если Вы хотите решить не задачу в целом, а просто выполнить ТЗ, то ТЗ выполнить
нельзя, т.к. в триггере создать таблицу нельзя.

Обеспечить ровно миллион строк в таблице тоже нельзя (потому что, например, что
Вы будете делать после удаления 47й строки?)

Неактивен

 

#17 01.02.2012 08:02:26

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

Там не будет удаления вообще. Только добавление.


Скажи миру - НЯ!

Неактивен

 

#18 01.02.2012 08:08:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не знаю как составить триггер

И не будет выборок вообще. Только добавление.

Эта форма организации данных называется «журнал», очень рекомендую.
Делаете файлик на диске, в него складываете миллион строк, потом дела-
ете следующий файлик wink

Что касается базы данных — ну, давайте чуть более сложный пример.
есть таблица с 999 999 записями, и одновременно приходят два запроса на
вставку. Какой попадет куда? И почему? Как Вы собираетесь поступать
с такими транзакциями?

Неактивен

 

#19 01.02.2012 08:17:23

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

Первый на обработку должен попасть внутрь, а второй получить отказ


Скажи миру - НЯ!

Неактивен

 

#20 01.02.2012 14:40:22

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не знаю как составить триггер

Отказ?

Напишите триггер, который запрещает вставку в таблицу, если в ней более
миллиона строк. Будут отказы. Увидели отказ — создали новую табличку wink

Неактивен

 

#21 01.02.2012 14:56:02

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

Без понятия как это делается http://img.okean.de/img/smileys/cry_24.gif


Скажи миру - НЯ!

Неактивен

 

#22 01.02.2012 15:50:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не знаю как составить триггер

Если MySQL 5.5, то можно просто выставить сигнал: http://dev.mysql.com/doc/refman/5.5/en/signal.html
В более ранних версиях прийдется написать какой-то костылик. Например,
SELECT THIS_IS_AN_ERROR FROM INEXISTENT_TABLE;

Неактивен

 

#23 02.02.2012 14:29:06

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

Это в каких же репозаториях уже есть версия 5.5.


Скажи миру - НЯ!

Неактивен

 

#24 03.02.2012 14:51:41

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Не знаю как составить триггер

Паулус, можно про "костылёк" поподробней?


Скажи миру - НЯ!

Неактивен

 

#25 03.02.2012 15:41:42

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Не знаю как составить триггер

Скорее всего Паулус вот про вот этот костыль упоминал - внесение в триггер запроса, который обязательно свалится.
Или SELECT THIS_IS_AN_ERROR FROM INEXISTENT_TABLE; - выбрать несуществующее поле из несуществующей таблицы - стопроцентный вариант.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson