事情是这样的。我需要在表中插入一行,但前提是行数小于10。
通常情况下,我通过:
SELECT COUNT(*) FROM mytable WHERE cDate = '2019-01-01'
- 检查返回值是否小于10。如果没有,那么我需要向用户返回一条消息
- 如果小于10。我做
INSERT INTO mytable (cDate) VALUE ('2019-01-01')
现在这是在服务器上运行的,表有9行。因此,如果我在检查行数时,另一个用户也进行了同样的检查,它将再次返回9行(因为INSERT还没有发生(。这将导致两个插入,总共给出11行,其中允许的最大值为10。
我该如何防止这种情况发生?
您可以使用dual:
INSERT INTO tReservations (cClass, cFecha, cDNI) SELECT '12','2019-11-13','30913307' FROM DUAL WHERE 12 > (SELECT COUNT(*) AS cnt FROM tReservations WHERE cFecha ='2019-11-13' AND cClass = '12')
它将在COULMN NAMES SHOULD BE EQUAL TO SELECTED COLUMNS FROM THE DATABASE TABLE
中工作
V表示值,C表示列名要在哪里插入数据。
INSERT INTO TABLE NAME(C1,C2,C3,C4
VALUES(SELECT v1,v2,v3,COUNT(*) as COUNT
FROM mytable
WHERE cDate = '2019-01-01'
AND COUNT >10)