تعتمد OFFSET على مواضع الصفوف في النتيجة الحالية، ولا تتذكر آخر سجل شاهده المستخدم في طلب سابق. إذا عُرضت الصفحة الأولى ثم أُضيف صف يسبقها في الترتيب، تتحرك مواضع بعض الصفوف القديمة. وعند طلب الصفحة الثانية بالإزاحة المعتادة، قد يظهر فيها سجل كان موجودًا بالفعل في الصفحة الأولى.
يمكن أن يحدث ذلك حتى عندما يكون الترتيب واضحًا والقيم المستخدمة فيه مختلفة تمامًا. المشكلة هنا ناتجة عن تغير القائمة بين استعلامين، لا عن تعادل قيم الترتيب. لتفسير النتيجة، اكتب القائمة المرتبة عند كل استعلام بصورة مستقلة، ثم طبق الإزاحة على القائمة الجديدة. لا تستخدم المواضع القديمة بعد تغير البيانات، لأن OFFSET تتجاوز عددًا من الصفوف الحالية ولا تتجاوز قائمة محفوظة من المعرفات السابقة.
مثال
CREATE TABLE tasks_shift_demo (id INT);
INSERT INTO tasks_shift_demo VALUES (10), (20), (30), (40);
SELECT id FROM tasks_shift_demo ORDER BY id LIMIT 2 OFFSET 0;
INSERT INTO tasks_shift_demo VALUES (5);
SELECT id FROM tasks_shift_demo ORDER BY id LIMIT 2 OFFSET 2;
باختصار: تغير البيانات بين الصفحات يغير المواضع، ولذلك قد تعيد OFFSET سجلًا سبق عرضه.
هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.