在插入mysql表之前验证

rjjhvcjd  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(288)

在mysql表中添加约束以拒绝相同类型的第三次插入,最有效的方法是什么?

  1. CREATE TABLE `stack_over_t` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `data` varchar(45) NOT NULL,
  4. `category` int(10) unsigned NOT NULL,
  5. PRIMARY KEY (`id`)
  6. )


理想情况下,我希望阻止category=1的insert(插入前触发?),因为已经有两个category为1的条目。我该怎么做?我可以扩展到多个列吗?

ux6nzvsh

ux6nzvsh1#

  1. DELIMITER $$
  2. USE `database_name`$$
  3. DROP TRIGGER /*!50032 IF EXISTS */ beforinsertblock $$
  4. CREATE
  5. /*!50017 DEFINER = 'root'@'localhost' */
  6. TRIGGER beforinsertblock BEFORE INSERT ON `stack_over_t`
  7. FOR EACH ROW BEGIN
  8. DECLARE COUNT INT(11);
  9. select count(*) INTO COUNT from stack_over_t WHERE category='1';
  10. IF(COUNT>2) THEN
  11. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'STATMENT';
  12. END IF ;
  13. END;
  14. $$
  15. DELIMITER ;

您可以阻止插入查询

展开查看全部
gopyfrb3

gopyfrb32#

使用insert ignore命令而不是insert命令。例子:
mysql>insert ignore into person_tbl(姓,名)->值('jay','thomas');查询正常,1行受影响(0.00秒)
mysql>insert ignore into person_tbl(姓,名)->值('jay','thomas');查询正常,0行受影响(0.00秒)

oxosxuxt

oxosxuxt3#

如果您使用的是trigger,则可以设置客户端和服务器端验证。

  1. DELIMITER $$
  2. CREATE TRIGGER example_before_insert_allow_only_one_active
  3. BEFORE INSERT ON stack_over_t FOR EACH ROW
  4. BEGIN
  5. IF (SELECT COUNT(id) FROM stack_over_t
  6. WHERE id=NEW.id AND data=NEW.data) > 0
  7. THEN
  8. SIGNAL SQLSTATE '45000'
  9. SET MESSAGE_TEXT = 'Cannot add or update row: only one active row allowed per type';
  10. END IF;
  11. END;
  12. $$
  13. CREATE TRIGGER example_before_update_allow_only_one_active
  14. BEFORE UPDATE ON stack_over_t FOR EACH ROW
  15. BEGIN
  16. IF (SELECT COUNT(id) FROM stack_over_t
  17. WHERE id=NEW.id AND data=NEW.data) > 0
  18. THEN
  19. SIGNAL SQLSTATE '45000'
  20. SET MESSAGE_TEXT = 'Cannot add or update row: only one active row allowed per type';
  21. END IF;
  22. END;
  23. $$
展开查看全部

相关问题