我需要限制插入数据库表中的行数。
我想实现一种逻辑,以检查执行新插入时是否达到限制:如果达到最大记录数,我将删除表中最旧的记录。
我尝试按照建议的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
答案 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.