考虑以下几点:
DROP TABLE IF EXISTS bookings;
CREATE TABLE bookings
(booking_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,user_id INT NOT NULL
,type INT NOT NULL
,booking_date DATE NOT NULL
,UNIQUE(user_id,booking_date)
);
INSERT INTO bookings (user_id, type, booking_date)
SELECT 1
, 1
, '2017-08-05'
FROM (SELECT 1) x
WHERE (SELECT COUNT(*)
FROM bookings
WHERE booking_date = '2017-08-05'
AND type = 1) < 5;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
INSERT INTO bookings (user_id, type, booking_date)
SELECT 2
, 1
, '2017-08-05'
FROM (SELECT 1) x
WHERE (SELECT COUNT(*)
FROM bookings
WHERE booking_date = '2017-08-05'
AND type = 1) < 5;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
INSERT INTO bookings (user_id, type, booking_date)
SELECT 3
, 1
, '2017-08-05'
FROM (SELECT 1) x
WHERE (SELECT COUNT(*)
FROM bookings
WHERE booking_date = '2017-08-05'
AND type = 1) < 5;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
INSERT INTO bookings (user_id, type, booking_date)
SELECT 4
, 1
, '2017-08-05'
FROM (SELECT 1) x
WHERE (SELECT COUNT(*)
FROM bookings
WHERE booking_date = '2017-08-05'
AND type = 1) < 5;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
INSERT INTO bookings (user_id, type, booking_date)
SELECT 5
, 1
, '2017-08-05'
FROM (SELECT 1) x
WHERE (SELECT COUNT(*)
FROM bookings
WHERE booking_date = '2017-08-05'
AND type = 1) < 5;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
SELECT * FROM bookings;
+------------+---------+------+--------------+
| booking_id | user_id | type | booking_date |
+------------+---------+------+--------------+
| 1 | 1 | 1 | 2017-08-05 |
| 2 | 2 | 1 | 2017-08-05 |
| 3 | 3 | 1 | 2017-08-05 |
| 4 | 4 | 1 | 2017-08-05 |
| 5 | 5 | 1 | 2017-08-05 |
+------------+---------+------+--------------+
5 rows in set (0.00 sec)
INSERT INTO bookings (user_id, type, booking_date)
SELECT 6
, 1
, '2017-08-05'
FROM (SELECT 1) x
WHERE (SELECT COUNT(*)
FROM bookings
WHERE booking_date = '2017-08-05'
AND type = 1) < 5;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
SELECT * FROM bookings;
+------------+---------+------+--------------+
| booking_id | user_id | type | booking_date |
+------------+---------+------+--------------+
| 1 | 1 | 1 | 2017-08-05 |
| 2 | 2 | 1 | 2017-08-05 |
| 3 | 3 | 1 | 2017-08-05 |
| 4 | 4 | 1 | 2017-08-05 |
| 5 | 5 | 1 | 2017-08-05 |
+------------+---------+------+--------------+
5 rows in set (0.00 sec)