限制在MySQL数据库表中插入的行数

时间:2019-05-20 08:25:36

标签: mysql database triggers

我需要限制插入数据库表中的行数。

我想实现一种逻辑,以检查执行新插入时是否达到限制:如果达到最大记录数,我将删除表中最旧的记录。

我尝试按照建议的here使用触发器来实现此功能,但出现错误:

ERROR 1442: 1442: Can't update table 'tableName' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

那我该如何实现呢?

注意我正在使用MySQL v5.7.25

2 个答案:

答案 0 :(得分:0)

在我的评论中,为什么不只填写表格,然后仅执行更新?

例如

 DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,val CHAR(1)
,ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERT INTO my_table (val) VALUES ('a');
INSERT INTO my_table (val) VALUES ('b');
INSERT INTO my_table (val) VALUES ('c');

SELECT * FROM my_table;
+----+------+---------------------+
| id | val  | ts                  |
+----+------+---------------------+
|  1 | a    | 2019-05-20 09:54:09 |
|  2 | b    | 2019-05-20 09:54:15 |
|  3 | c    | 2019-05-20 09:54:19 |
+----+------+---------------------+
3 rows in set (0.00 sec)

UPDATE my_table SET val = 'd' ORDER BY ts, id LIMIT 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

SELECT * FROM my_table;
+----+------+---------------------+
| id | val  | ts                  |
+----+------+---------------------+
|  1 | d    | 2019-05-20 09:54:37 |
|  2 | b    | 2019-05-20 09:54:15 |
|  3 | c    | 2019-05-20 09:54:19 |
+----+------+---------------------+

答案 1 :(得分:0)

在存储的函数或触发器中,不允许修改调用该函数或触发器的语句已在使用(用于读取或写入)的表。

MySQL不允许这样做,请参见Restrictions 所有其他主要的DBMS都支持此功能,因此希望MySQL会尽快添加此支持。

在这种情况下,您可以根据自己的喜好务实地处理此问题。

Before insert data just check total number of row of that table. If reach rows limit, then call delete method.