способы реализации ограничения строк MySQL - PullRequest
1 голос
/ 09 декабря 2011

Кто-нибудь знает, возможно ли реализовать ограничение строк в MySQL?

Допустим, у меня есть очень простая таблица для поддержки промо-кодов для интернет-магазина:

CREATE TABLE `promotioncodes` (
  `promotionid` int(11) NOT NULL AUTO_INCREMENT,
  `promotioncode` varchar(30) DEFAULT NULL,
  `partnerid` int(11) DEFAULT NULL,
  `value` double DEFAULT NULL,
  `nr_of_usage` int(11) NOT NULL DEFAULT '0',
  `valid_from` datetime DEFAULT '0000-00-00 00:00:00',
  `valid_through` datetime DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`promotionid`),
  UNIQUE KEY `promotioncode_unique` (`promotioncode`)
)

Есть лиВ любом случае убедитесь, что что при вставке или обновлении строки:

1) Дата 'valid_from' всегда 'меньше' (в терминах дат), чем 'valid_through'.

2) Если поле valid_from оставлено пустым / пустым, значение valid_through также должно быть пустым / пустым.

3) Если значение valid_through оставлено пустым / nullдолжно быть также пустым / нулевым.

Я прочитал кое-что о триггерах и хранимых процедурах, но у меня нет ощущения, что это решение: /?Если они являются решением, то, пожалуйста, дайте мне конкретный пример того, как реализовать это

1 Ответ

1 голос
/ 09 декабря 2011

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

Вот пример.

create procedure promotioncodes_insert(
  IN...  list of params
  OUT error_code
)
exec:begin
  set error_code = 0; -- everything is ok

  if valid_from > valid_thru then
    set error_code = -1; -- error
    leave exec;
  end if;

  if (valid_from is null) and (valid_thru is not null) then
    set error_code = -2; -- another kind of error
    leave exec;
  end if;

  -- and so on

  -- doing insert

end;

Обратите внимание, что если вы будете выполнять прямую вставку, например insert into promocodes() values(), эти ограничения не будут работать.

...