На самом деле очень интересный вопрос. Логику, которую вам предлагают выше, всё-равно придётся использовать. Т.е. начинаем транзакцию, пробуем воткнуть данные, если что-то пошло не так - откатываем транзакцию. Но, насколько я вас понял, в первую очередь вам не нравится, что ограничения на количество мест придётся выносить в код, и откатывать транзакцию тоже из кода. Это нормальная практика, но если очень хочется вынести ограничения в базу - посмотрите в сторону
CONSTRAINT. Правда есть эта штука только в последней версии MySQL (в PostgreSQL есть давно). С помощью этих проверок вы можете, например, создать колонку с количеством свободных мест в ресторане и потребовать, чтобы оно было не отрицательно. Тогда на уровне кода вам нужно будет только не забыть скрутить на единицу счётчик свободных мест. Если ограничение будет нарушено, то база плюнет ошибкой и транзакция откатится.