ينفورميكس: ماذا يحدث عند حذف صف واحد مع المفتاح الأساسي مسلسل / serial8؟

StackOverflow https://stackoverflow.com/questions/1819040

  •  10-07-2019
  •  | 
  •  

سؤال

وكان لي سؤال سريع على أنواع البيانات التسلسلية المستخدمة في المفتاح الأساسي على ينفورميكس ديسيبل ل.

إذا قمت بحذف صف واحد، سوف ترحيل رئيسيا المسلسل على العد أم أنها إعادة ضبط أي الصفوف التي تم حذفها؟

وحتى إذا كان الصف الحالي هو المسلسل لا 5، وحذف الصف رقم ويتس المسلسل لا 3، وسوف تكون القيمة التالية 6 والحفاظ على تحمل؟ ليس التسلسلي 3 التي يتم الآن حذف إلى الأبد فقدت عدم استخدامها مرة أخرى؟

هل كانت مفيدة؟

المحلول

والعداد التي تستخدمها SERIAL، SERIAL8 أو BIGSERIAL يتزايد مفردة النغمة حتى يلتف حولها. يتم حذف القيم حذف ببساطة. إذا قمت بإدراج قيمة حرفية أكبر من العداد، ويتم ضبط العداد بحيث تكون القيمة إدراج المقبلة هي واحدة أكبر:

CREATE TABLE s (s SERIAL(2) NOT NULL PRIMARY KEY, v VARCHAR(20) NOT NULL);

INSERT INTO s(s,v) VALUES(0, "Row 2");
INSERT INTO s(s,v) VALUES(0, "Row 3");
INSERT INTO s(s,v) VALUES(0, "Row 4");
INSERT INTO s(s,v) VALUES(0, "Row 5");
DELETE FROM s WHERE s = 3;
INSERT INTO s(s,v) VALUES(0, "Row 6");
INSERT INTO s(s,v) VALUES(8, "Row 8"); -- Skip 7
INSERT INTO s(s,v) VALUES(0, "Row 9");

SELECT * FROM s ORDER BY s;

وهذا يولد نتائج:

          2     Row 2
          4     Row 4
          5     Row 5
          6     Row 6
          8     Row 8
          9     Row 9

وجميع أنواع تتصرف بالمثل. إذا وصلت إلى الحد الأقصى (2 ^ 32-1 لSERIAL، 2 ^ 63-1 لSERIAL8 وBIGSERIAL)، ثم العداد يلتف الى نقطة الصفر، ولكن قد واجهت مشاكل مع مسافات unvacated إعادة استخدامها ورفض المفتاح الأساسي لل الصفوف المكررة. عموما، وتجنب التفاف عليها. (يستغرق الامر بعض الوقت لجعلها التفاف، خصوصا عدادات 64 بت).

لاحظ أنه يمكنك إدراج قيمة 'مفقود' يدويا - مثل 3 أو 7. ومع ذلك، فإن IDS لا نفعل ذلك لك

وiQ سأل:

<اقتباس فقرة>   

وحتى لا ينفورميكس تلقائيا إعادة استخدام القيم التسلسلية غير المستخدمة أو حذفها عندما يلتف حولها؟

وليس حقا. قيمة يلتف إلى 1؛ إذا كان الصف مع قيمة 1 موجود، يفشل إدراج. إذا لم يحدث ذلك، نجحت. في كلتا الحالتين، والمحاولة القادمة سيحاول 2. لتوضيح، والاستمرار حيث غادر المثال الأخير قبالة:

INSERT INTO s(s,v) VALUES(2147483647, "Row 2,147,483,647");
INSERT INTO s(s,v) VALUES(0, "Row next")     { 1 - Pass };
INSERT INTO s(s,v) VALUES(0, "Row next + 1") { 2 - Fail };
INSERT INTO s(s,v) VALUES(0, "Row next + 2") { 3 - Pass };
INSERT INTO s(s,v) VALUES(0, "Row next + 3") { 4 - Fail };
SELECT * FROM s ORDER BY s;

والنتيجة النهائية هي:

          1     Row next            
          2     Row 2               
          3     Row next + 2        
          4     Row 4               
          5     Row 5               
          6     Row 6               
          8     Row 8               
          9     Row 9               
 2147483647     Row 2,147,483,647   

ومن الواضح أن تفشل إدراج الثلاث المقبلة، يمكن لأحد أن تنجح، فإن اثنين من أكثر تفشل، وبعد ذلك سوف تنجح لالمقبلين مليار تدرج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top