Кажется, на мой общий вопрос отвечает https://stackoverflow.com/a/3025332/3650835,, но я не до конца понимаю его после прочтения документации MySql, и мне интересно, будет ли мое решение работать так, как я ожидаю, а также интересно, нужен ли LIMIT 1.
Цель : обеспечить, чтобы при заданном user_id начало и конец никогда не пересекались.Как пример:
test_table
user_id start end
4 1 5
4 6 13
4 11 17 --> NOT allowed, bc 11 <= 13
2 1 9 --> allowed, user_id is different
Мое текущее решение
/* this should not insert anything, as it would cause an "overlap" of start
and end, based on row 2 having end = 13 */
INSERT INTO `test_table` (user_id, start, end)
SELECT '4', '11', '17' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `test_table`
WHERE user_id = '4' AND end >= '11')
LIMIT 1;
Имеет ли раздел WHERE NOT EXISTS
означает «только вставлять ... если этот следующий выбор ничего не возвращает»?
Кроме того, в связанном решении был следующий комментарий, но я не понимаю, почему на основе документов MySql это было бы верно,Если это правда, я мог бы удалить Предел 1 из моего решения:
Если вы используете «из двойного» в строке 2 вместо «из таблицы», то вам не нужно условие «предел 1»
Спасибо за ваше время.
Редактировать: вот все sql для тестирования / настройки:
CREATE TABLE `test_table`(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`user_id` INT,
`start` INT,
`end` INT
);
INSERT INTO `test_table` (user_id, start, end)
SELECT '4', '1', '5' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `test_table`
WHERE user_id = '4' AND end >= '1')
LIMIT 1;
INSERT INTO `test_table` (user_id, start, end)
SELECT '2', '1', '9' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `test_table`
WHERE user_id = '2' AND end >= '1')
LIMIT 1;
INSERT INTO `test_table` (user_id, start, end)
SELECT '4', '6', '13' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `test_table`
WHERE user_id = '4' AND end >= '6')
LIMIT 1;
/* this should not insert anything, as it would cause an "overlap" of start and end */
INSERT INTO `test_table` (user_id, start, end)
SELECT '4', '11', '17' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `test_table`
WHERE user_id = '4' AND end >= '11')
LIMIT 1;