MariaDB предельное значение столбца - PullRequest
0 голосов
/ 11 июня 2019

Я хочу ограничить значение столбца limited_column, где 0 >= limited_column <= 100 сторона SQL, на MariaDB

Я пытался создать триггер на INSERT ad UPDATE как таковой:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `username` varchar(25) NOT NULL,
  `user_id` int(100) NOT NULL,
  `limited_column` bigint(20) unsigned NOT NULL DEFAULT '0',
[...]
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

DELIMITER $$
CREATE TRIGGER `limited_column_check_on_insert_trigger` BEFORE INSERT ON `users` FOR EACH ROW
BEGIN
  DECLARE dummy,baddataflag INT;
  SET baddataflag = 0;
  IF NEW.limited_column > 100 THEN
    SET baddataflag = 1;
  END IF;
  IF NEW.limited_column < 0 THEN
    SET baddataflag = 1;
  END IF;
  IF baddataflag = 1 THEN
    SELECT CONCAT('Cannot INSERT new value because limited_column is > 100, value was ',NEW.limited_column)
    INTO dummy FROM information_schema.tables;
  END IF;
END; $$
CREATE TRIGGER `limited_column_check_on_update_trigger` BEFORE UPDATE ON `users` FOR EACH ROW
BEGIN
  DECLARE dummy,baddataflag INT;
  SET baddataflag = 0;
  IF NEW.limited_column > 100 THEN
    SET baddataflag = 1;
  END IF;
  IF NEW.limited_column < 0 THEN
    SET baddataflag = 1;
  END IF;
  IF baddataflag = 1 THEN
    SELECT CONCAT('Cannot UPDATE new value because limited_column is > 100, value was ',NEW.limited_column)
    INTO dummy FROM information_schema.tables;
  END IF;
END; $$
DELIMITER ;

Это то, что я получаю, если я пытаюсь вставить нового пользователя, когда limited_column> 100 (limited_column> 100 работает):

MariaDB [NameOfADatabase]> INSERT INTO users (username,user_id,limited_column,[...]) VALUES ('testestes',1,1000,[...]);
ERROR 1172 (42000): Result consisted of more than one row
MariaDB [NameOfADatabase]> INSERT INTO users (username,user_id,limited_column,[...]) VALUES ('testestes',2,100,[...]);
Query OK, 1 row affected (0.02 sec)

Любые идеи о том, что я могу сделать, чтобы сделать это более изящным?

Это работает на 10.1.38-MariaDB-0ubuntu0.18.04.2 Ubuntu 18.04

1 Ответ

0 голосов
/ 12 июня 2019

Обновление до 10.3.15 было лучшим решением для этого, так как я могу использовать опцию CHECK.Спасибо @RickJames за информацию об обновлении.

Вот схема, которую я использую, которая работает:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `username` varchar(25) NOT NULL,
  `user_id` int(100) NOT NULL,
  `limited_column` bigint(20) unsigned NOT NULL DEFAULT '0',
[...]
  PRIMARY KEY (`user_id`),
  CHECK (limited_column<=100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Вот вывод, который я получаю:

MariaDB [NameOfADatabase]> INSERT INTO users (username,user_id,limited_column,[...]) VALUES ('test1',1,100,[...]);
Query OK, 1 row affected (0.016 sec)

MariaDB [NameOfADatabase]> INSERT INTO users (username,user_id,limited_column,[...]) VALUES ('test2',2,101,[...]);
ERROR 4025 (23000): CONSTRAINT `CONSTRAINT_1` failed for `NameOfADatabase`.`users`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...