【问题标题】:How to limit number of rows can be store in mysql table?如何限制可以存储在mysql表中的行数?
【发布时间】:2020-05-06 02:42:06
【问题描述】:

我需要将 MySQL 表中可以插入的行数限制为 10。我只需要从 MySQL 实现这个,即不使用任何编程语言。

我已经创建了一个实现 MAX_ROWS = 10 的表,但它不起作用。

请检查这些屏幕截图。

我很困惑如何做到这一点。如果有人能为我提供解决方案,那对我真的很有帮助。

谢谢。

【问题讨论】:

  • 这取决于当有人试图插入第 11 行时你想要做什么。您可以使用before insert 触发器来检查现有行数并在有十行时中止插入。
  • 您所指的 MAX rows 不是对行数的限制,它在创建 DB 文件时用作如何存储数据和保留空间的指南。
  • 也就是说,我会选择以下两种方法之一:插入 10 行然后只允许更新,或者在查询本身中处理插入逻辑。
  • 约束

标签: mysql


【解决方案1】:

我认为 MySQL 没有提供这样的内置功能。一种解决方案是您可以创建触发器。

CREATE TRIGGER your_trigger_name
BEFORE INSERT ON your_table_name
FOR EACH ROW
BEGIN
    DECLARE cnt INT;

    SELECT count(*) INTO cnt FROM your_table_name;

    IF cnt = 10 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'You can store only 10 records.';
    END IF;
END;

在你的桌子上试试上面的触发器。将您的 table_name 替换为 your_table_name

希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    由于检查约束似乎不适用于 MySql。您可以尝试在您的表上创建一个BEFORE INSERT TRIGGER 并将NEW.column 的值设置为NULL,以便某些不可为空的列中断插入语句。

    Ex:  
    CREATE TABLE mytable (
        id INT NOT NULL,
        col1 VARCHAR(255) NOT NULL,
        col2 VARCHAR(255),
    );  
    
    DELIMITER $$
    CREATE TRIGGER mytable_before_trig BEFORE INSERT ON mytable
    FOR EACH ROW
    BEGIN 
    IF (SELECT COUNT(id) FROM mytable) > 3 THEN
        SET NEW.id = NULL;
    END IF;
    END;
    $$  
    

    现在尝试在 mytable 中插入记录,它会通过抛出错误来忽略第 4 条记录。

    【讨论】:

    • 或者,您知道,使用信号正确中止并带有不错的错误消息?有一天,有人决定将此列设为空 -> 代码中断,没有人知道为什么。
    • @fancyPants 请为我提供上表'mytable'的MySql查询。
    【解决方案3】:

    这里有一个想法...:

    CREATE TABLE my_table
    (id int auto_increment PRIMARY KEY  
    ,val char(1) NOT NULL
    );
    
    INSERT INTO my_table (val) SELECT 'b' FROM (SELECT 1) x WHERE (SELECT COUNT(*) FROM my_table) < 5;
    Query OK, 1 row affected (0.02 sec)
    
    INSERT INTO my_table (val) SELECT 'b' FROM (SELECT 1) x WHERE (SELECT COUNT(*) FROM my_table) < 5;
    Query OK, 1 row affected (0.02 sec)
    
    INSERT INTO my_table (val) SELECT 'b' FROM (SELECT 1) x WHERE (SELECT COUNT(*) FROM my_table) < 5;
    Query OK, 1 row affected (0.02 sec)
    
    INSERT INTO my_table (val) SELECT 'b' FROM (SELECT 1) x WHERE (SELECT COUNT(*) FROM my_table) < 5;
    Query OK, 1 row affected (0.02 sec)
    
    INSERT INTO my_table (val) SELECT 'b' FROM (SELECT 1) x WHERE (SELECT COUNT(*) FROM my_table) < 5;
    Query OK, 1 row affected (0.02 sec)
    
    INSERT INTO my_table (val) SELECT 'b' FROM (SELECT 1) x WHERE (SELECT COUNT(*) FROM my_table) < 5;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    INSERT INTO my_table (val) SELECT 'b' FROM (SELECT 1) x WHERE (SELECT COUNT(*) FROM my_table) < 5;
    Query OK, 0 rows affected (0.00 sec)
    
    SELECT * FROM my_table;
    +----+-----+
    | id | val |
    +----+-----+
    |  1 | b   |
    |  2 | b   |
    |  3 | b   |
    |  4 | b   |
    |  5 | b   |
    +----+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多