كيف يمكنني معرفة ما إذا كان سكليتي مؤشر هي فريدة من نوعها ؟ (مع SQL)

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

  •  03-07-2019
  •  | 
  •  

سؤال

أريد معرفة ، مع استعلام SQL ، سواء فهرس فريد أو لا.أنا باستخدام سكليتي 3.

لقد حاولت نهجين:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

هذا بإرجاع معلومات حول مؤشر ("اكتب", "name", "tbl_name", "rootpage" و "sql").علما بأن sql عمود فارغ عندما يكون مؤشر يتم إنشاؤه تلقائيا من قبل سكليتي.

PRAGMA index_info(sqlite_autoindex_user_1);

هذا يعود الأعمدة في المؤشر ("seqno", "سيد" و "اسم").

أي اقتراحات أخرى ؟

تحرير: المثال أعلاه هو الذي تم إنشاؤه تلقائيا مؤشر, ولكن سؤالي هو عن وفهارس عامة.على سبيل المثال ، يمكنك إنشاء فهرس مع "إنشاء فهرس فريد index1 على زيارة (المستخدم, التاريخ)".فإنه لا يبدو الأمر SQL سوف تظهر إذا كان بلدي جديد مؤشر فريدة من نوعها أم لا.

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

المحلول

PRAGMA INDEX_LIST('table_name');

إرجاع الجدول مع 3 أعمدة:

  1. seq رقمي فريد معرف مؤشر
  2. name اسم الفهرس
  3. unique تفرد العلم (صفرية إذا UNIQUE مؤشر.)

ثم مجرد حلقة من خلال الناتجة الصفوف حتى ترى اسم الفهرس كنت ترغب في الاستعلام (للأسف لا يمكنك الحصول على WHERE شرط في PRAGMA البيان.)

نصائح أخرى

منذ لا أحد لديه إجابة جيدة, أعتقد أن أفضل حل هو هذا:

  • إذا كان مؤشر يبدأ مع "sqlite_autoindex" ، الذي تم إنشاؤه تلقائيا مؤشر واحد فريدة من نوعها العمود
  • وإلا فإن نظرة فريدة من نوعها الكلمة في sql عمود في الجدول sqlite_master ، مع شيء من هذا القبيل:

    حدد * من sqlite_master حيث type = 'index' و sql مثل '%فريدة من نوعها%'

يمكنك برمجيا بناء select لمعرفة ما إذا كان أي الصفوف نقطة إلى أكثر من صف واحد.إذا كنت أعود ثلاثة أعمدة, فو, بار باز إنشاء الاستعلام التالي

select count(*) from t
group by foo, bar, baz
having count(*) > 1

إذا إرجاع أية صفوف الفهرس الخاص بك ليست فريدة من نوعها ، منذ أكثر من صف واحد الخرائط معين tuple.إذا sqlite3 يدعم مشتقة الجداول (يجب أن يكون بحاجة لذلك أنا لا أعرف قبالة اليد) ، يمكنك أن تجعل حتى أكثر إيجازا:

select count(*) from (
    select count(*) from t
    group by foo, bar, baz
    having count(*) > 1
)

هذا سيعود صف واحد مجموعة النتائج تدل على عدد تكرار tuple مجموعات.إذا الإيجابي, الفهرس الخاص بك ليست فريدة من نوعها.

كنت قريبة:

1) إذا كان مؤشر يبدأ مع "sqlite_autoindex", هو تلقائي مؤشر المفتاح الأساسي .بيد أن هذا لن يكون في sqlite_master أو sqlite_temp_master الجداول اعتمادا اعتمادا على ما إذا كان الجدول يتم فهرستها مؤقتة.

2) تحتاج إلى احترس من الجدول أسماء الأعمدة التي تحتوي على فرعية unique, لذلك كنت ترغب في استخدام:

SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'

ترى سكليتي موقع الوثائق على إنشاء فهرس

كما سكليتي 3.16.0 هل يمكن أيضا استخدام pragma وظائف:

SELECT distinct il.name
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table' AND il.[unique] = 1;

البيان أعلاه سيتم سرد كافة أسماء الفهارس الفريدة.

SELECT DISTINCT m.name as table_name, ii.name as column_name
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table' AND il.[unique] = 1;

البيان أعلاه سوف يعود جميع الجداول و الأعمدة إذا كان العمود هو جزء من فهرس فريد.

من مستندات:

الجدول الكرام وظائف PRAGMA ميزة تم إضافتها في SQLite النسخة 3.16.0 (2017-01-02).الإصدارات السابقة من سكليتي لا يمكن استخدام هذه الميزة.

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