خطأ غريب في إنشاء ... حدد: خطأ 1062 (23000): إدخال مكرر "0" للمفتاح 1

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

  •  29-09-2019
  •  | 
  •  

سؤال

هذا هو الاستعلام الإشكالي (مع المعنى المقصود: اسحب جميع الكيانات المقترنة بالكيان 530 في جدول جديد ، مع عدد الأزواج):

CREATE TEMPORARY TABLE paired (
  entity_id INTEGER PRIMARY KEY,
  numrels INTEGER
)
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels
FROM pairs I
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL
GROUP BY I.entity2_id
;

أفسر رسالة الخطأ:

ERROR 1062 (23000): Duplicate entry '0' for key 1

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

CREATE TEMPORARY TABLE paired (
  entity_id INTEGER PRIMARY KEY,
  numrels INTEGER
)
;
INSERT INTO paired
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels
FROM pairs I
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL
GROUP BY I.entity2_id
;

من المثير للدهشة أن هذا يعمل دون أي مشاكل ، على الرغم من أنه ، وفقًا لفهمي ، يجب أن يكون الاثنان متكافئين.

ما يعطي؟!؟

كمرجع:

mysql  Ver 14.12 Distrib 5.0.82sp1, for redhat-linux-gnu (x86_64) using readline 5.1
هل كانت مفيدة؟

المحلول

بياناتك ليست متكافئة. CREATE ... SELECT يخلق الأعمدة التي ذكرتها في CREATE جزء من العبارة (أي ، entity_id و numrels) ، بالإضافة إلى ذلك ينشئ أعمدة لكل عمود SELECT جزء من البيان. ينتهي بك المطاف بأربعة أعمدة في جدولك الجديد. نتائج SELECT يتم إدخالها في العمودين الأخيرين. تمتلئ الأعمدة الأخرى بقيمها الافتراضية ، مما يؤدي إلى انتهاك تفرد المفتاح الأساسي الخاص بك.

أنظر أيضا http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html

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