Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Новичкам

Важная информация

Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.04.2010, 14:05   #1
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию Ограничение значений в БД

Доброго времени суток сообществу RMDC. Столкнулся проблемой ограничения максимального значения в БД. Например есть таблица в которой колонка с некоторыми цифровыми данными(smallint). Необходимо установить максимальное значение которое может быть в данной колонке. И если есть такая возможность - при превышении данного значения оно сбрасывалось на определенное число/ноль.

Пример таблицы:
Код:
---- ----------- ------------ --------------
ID       points       date        date_points  
---- ----------- ------------ -------------
1        59          20100427          5            
2        68          20100424          5            
3        35          20100406          3            
4        22          20100428          0            
5        109         20100428          5            
6        107         20100428          3            
7        1           20100428          1            
---------------------------------------------
Так вот, если в таблице появляется число выше 100(в колонке points), то результат должен сбрасываться на 0. Таблица заполняется через .php скрипт на сайте:

Код:
     execute_query("INSERT INTO `points` (`id`) VALUES
                (".$_SESSION["user_id"].")");
		$_SESSION["points"] = 0;
		$_SESSION["date"] = date("Ymd");
		$_SESSION["date_points"] = 0;

Последний раз редактировалось selector; 28.04.2010 в 14:08.
selector вне форума   Ответить с цитированием
Старый 28.04.2010, 14:16   #2
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Если таблица заполняется пхп скриптом, то логично проверку на 100 в ПХП и реализовать...
KiriX вне форума   Ответить с цитированием
Старый 28.04.2010, 15:13   #3
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

проще создать триггер для этой таблицы
ghostpast вне форума   Ответить с цитированием
Старый 28.04.2010, 15:23   #4
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

Можно примеры привести. Особенно интересует триггер для таблицы.
selector вне форума   Ответить с цитированием
Старый 28.04.2010, 15:42   #5
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от ghostpast Посмотреть сообщение
проще создать триггер для этой таблицы
Триггеры в таблице для MySQL - это интересно - тоже не против был бы наглядный пример увидеть
KiriX вне форума   Ответить с цитированием
Старый 28.04.2010, 16:13   #6
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Код:
delimiter|
CREATE TRIGGER points_limiter AFTER UPDATE ON points
  IF (NEW.points >= 100)
  THEN
     UPDATE points SET points = 0 WHERE id = NEW.id;
  END IF;
END
|
но это криво
LordJZ вне форума   Ответить с цитированием
Старый 28.04.2010, 16:43   #7
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

Все гораздо проще. Все новые значения points не будут превышать 100:
PHP код:
DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl (
  
id int(11unsigned NOT NULL AUTO_INCREMENT,
  
points int(11NOT NULL,
  
date date DEFAULT NULL,
  
date_points int(11NOT NULL,
  
PRIMARY KEY (id)
ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TRIGGER IF EXISTS example_trigger;
delimiter //
CREATE TRIGGER example_trigger BEFORE INSERT ON tbl
FOR EACH ROW
BEGIN
  
IF (NEW.points >= 100THEN
     SET 
NEW.points 0;
  
END IF;
END//
delimiter 

Последний раз редактировалось ghostpast; 28.04.2010 в 16:47.
ghostpast вне форума   Ответить с цитированием
Старый 28.04.2010, 18:01   #8
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

Может я что то не так делаю но не выходит(

Очистил таблицу, ввел триггер. Использовал запрос в пхп на сайте и значение все равно превысило 100
selector вне форума   Ответить с цитированием
Старый 28.04.2010, 18:05   #9
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

Цитата:
Сообщение от selector Посмотреть сообщение
Может я что то не так делаю но не выходит(

Очистил таблицу, ввел триггер. Использовал запрос в пхп на сайте и значение все равно превысило 100
таблица на движке InnoDB?
запросы в php точно INSERT?
Сервер MySQL точно не урезанный?
ghostpast вне форума   Ответить с цитированием
Старый 28.04.2010, 18:09   #10
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

Вот таблица:
PHP код:
create table `vt_points` (
    `
iddouble ,
    `
pointsdouble ,
    `
datevarchar (24),
    `
date_pointstinyint (2)
); 
вот триггер:
PHP код:
DELIMITER//
CREATE TRIGGER points_limiter AFTER UPDATE ON vt_points
  
IF (NEW.points >= 300)
  
THEN
     UPDATE points SET points 
0 WHERE id = NEW.id;
  
END IF;
END
// 
таблица на движке InnoDB? - да
запросы в php точно INSERT? - не все(1 есть и update)
Сервер MySQL точно не урезанный? - MySQL - 5.1.42-50.5.0.3.8 (Ubuntu 9.10)

Последний раз редактировалось selector; 28.04.2010 в 18:11.
selector вне форума   Ответить с цитированием
Старый 28.04.2010, 18:21   #11
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

Цитата:
Сообщение от selector Посмотреть сообщение
Вот таблица:
PHP код:
create table `vt_points` (
    `
iddouble ,
    `
pointsdouble ,
    `
datevarchar (24),
    `
date_pointstinyint (2)
); 
вот триггер:
PHP код:
DELIMITER//
CREATE TRIGGER points_limiter AFTER UPDATE ON vt_points
  
IF (NEW.points >= 300)
  
THEN
     UPDATE points SET points 
0 WHERE id = NEW.id;
  
END IF;
END
// 
таблица на движке InnoDB? - да
запросы в php точно INSERT? - не все(1 есть и update)
Сервер MySQL точно не урезанный? - MySQL - 5.1.42-50.5.0.3.8 (Ubuntu 9.10)
посмотрите внимательно на мой запрос создания триггера
PHP код:
DROP TRIGGER IF EXISTS insert_trigger;
DROP TRIGGER IF EXISTS update_trigger;

delimiter //

CREATE TRIGGER insert_trigger BEFORE INSERT ON vt_points
FOR EACH ROW
BEGIN
  
IF (NEW.points >= 100THEN
     SET 
NEW.points 0;
  
END IF;
END//

CREATE TRIGGER update_trigger BEFORE UPDATE ON vt_points
FOR EACH ROW
BEGIN
  
IF (NEW.points >= 100THEN
     SET 
NEW.points 0;
  
END IF;
END//

delimiter 
ghostpast вне форума   Ответить с цитированием
Старый 28.04.2010, 18:26   #12
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

Все гениальное просто. Не приметил:
Код:
BEFORE INSERT ON
Спс большое(кстати кнопка отключена в данном разделе? )
selector вне форума   Ответить с цитированием
Старый 28.04.2010, 19:06   #13
Anti
Пользователь
 
Аватар для Anti
 
Регистрация: 12.03.2010
Адрес: Беларусь
Сообщений: 54
Сказал(а) спасибо: 8
Поблагодарили 24 раз(а) в 17 сообщениях
Записей в дневнике: 1
Anti На верном пути
Отправить сообщение для Anti с помощью ICQ Отправить сообщение для Anti с помощью Skype™
По умолчанию

Тригеры как условия срабатываемые при определённых операциях? Те можно для любого оператора (инсерта апдейта) назначить дествие до/после - верно?
Anti вне форума   Ответить с цитированием
Старый 28.04.2010, 19:45   #14
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

Цитата:
Сообщение от Anti Посмотреть сообщение
Тригеры как условия срабатываемые при определённых операциях? Те можно для любого оператора (инсерта апдейта) назначить дествие до/после - верно?
да. триггеры - те же хранимые процедуры, вызываемые при операциях INSERT, UPDATE и DELETE

Последний раз редактировалось ghostpast; 28.04.2010 в 19:48.
ghostpast вне форума   Ответить с цитированием
Старый 28.04.2010, 20:22   #15
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Я наивно полагал (уже и не помню почему) что их в MySQL нет
KiriX вне форума   Ответить с цитированием
Старый 28.04.2010, 20:50   #16
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

они появились в 5.0
RomanRom2 вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать ограничение на статы Lemex Корзина 5 15.08.2010 12:48
Ограничение на использование игровой почты. Greshnikk Новичкам 0 07.06.2010 14:27
[9979][patch] Ограничение для арены Insider42 Принятые патчи 1 26.05.2010 23:37
Ограничение в запросе к sql Eisenheim Флудильня 14 17.03.2010 17:31


Текущее время: 07:27. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot