因此,我需要根据同一个表中其他条目的数量安全地限制表中条目的插入。假设我们有下表:
资源:(id,foreign_key)
我需要根据外键创建多个条目。所以,一旦我达到计数,让我们为我们的例子说100,我想限制创建更多的条目。
明显的答案是这样的:
事实上,这就是我一直在使用的东西。问题是,这种方法不是防故障的,因为在1和2之间可能会发生另一次插入。我考虑过使用交易的可能性,但(除非我完全误解交易)这有同样的问题:
现在,我们已经有99/100个条目和两个同时运行的事务。他们都会承诺,因为他们没有看到彼此的参赛作品。
没有实际创建条目然后删除它,如果它无效(在我的脑海里感觉有点混乱),我无法想出解决这个问题的方法。有任何想法吗?
编辑:根据要求我提供样本数据:
表1
+-------------+------------------+------+-----+----------------+
| Field | Type | Null | Key | Extra |
+-------------+------------------+------+-----+----------------+
| id | int(10) unsigned | NO | PRI | auto_increment |
| limit | int(10) unsigned | NO | MUL | |
+-------------+------------------+------+-----+----------------+
表2
+-------------+------------------+------+-----+----------------+
| Field | Type | Null | Key | Extra |
+-------------+------------------+------+-----+----------------+
| id | int(10) unsigned | NO | PRI | auto_increment |
| foreign_id | int(10) unsigned | NO | MUL | |
+-------------+------------------+------+-----+----------------+
以及一些示例数据:
表1
+----+----------+
| id | limit |
+----+----------+
| 1 | 5 |
+----+----------+
表2
+----+---------------+
| id | foreign_id |
+----+---------------+
| 1 | 1 |
+----+---------------+
| 2 | 1 |
+----+---------------+
| 3 | 1 |
+----+---------------+
| 4 | 1 |
+----+---------------+
此时,让我们说两个用户尝试创建table2条目。第一个将被接受,第二个被拒绝。
使用第一种方法,如果两个用户都通过步骤1(计算旧条目)然后通过步骤2(插入新条目),则将创建两个条目。
使用第二种方法,如果它们两者同时运行,它们将在它们自己之前计算4个槽并提交而不是其中一个回滚。
答案 0 :(得分:0)
Halo Mate,类似于此结构的存储过程可能会对您有所帮助
更新
DROP PROCEDURE IF EXISTS sp_insert_record;
DELIMITER //
CREATE PROCEDURE sp_insert_record(
IN insert_value1 INT(9),
IN chosen_id INT(9)
)
BEGIN
SELECT id, `limit`
INTO @id, @limit
FROM table1
WHERE id = chosen_id;
START TRANSACTION;
INSERT INTO table2 (id, foreign_id)
VALUES (insert_value1, chosen_id);
SELECT COUNT(id)
INTO @count
FROM table2
WHERE foreign_id = @id;
IF @count <= @limit THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END//
DELIMITER ;
通过使用存储过程,您还可以根据您的要求添加任何验证或过程。
希望这可以帮助,干杯!