时间:2019-06-11 02:20:50

标签: mariadb database-schema

我想限制MariaDB上limited_column SQL端的列0 >= limited_column <= 100的值

我尝试这样在INSERT广告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 :(得分:0)

为此,最好升级到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`