خطأ غريب في إنشاء ... حدد: خطأ 1062 (23000): إدخال مكرر "0" للمفتاح 1
-
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