الانتقال إلى المحتوى الرئيسي

مخطط SQL

تعرض علامة التبويب Schema SQL نص DDL للمخطط بحسب قاعدة البيانات المحددة: نص SQL الذي يُنشئ جداوله مع مفاتيحها وفهارسها ومفاتيحها الخارجية.
انتقل إلى علامة التبويب Schema SQL في شريط الأدوات، أو اختر Schema SQL ضمن Tab في البحث السريع. ويفتحها أيضًا اختيار Schema SQL من القائمة الفرعية Export، جاهزةً للحفظ، راجع حفظ نص SQL أو نسخه.

يقع نص SQL على اليسار، وعلى يمينه لوحة خيارات عنوانها Schema SQL تضم الخيارات التي تحدد شكله، راجع لوحة الخيارات. وحتى في لغة عرض تُكتب من اليمين إلى اليسار، يبقى نص SQL على اليسار ويُقرأ من اليسار إلى اليمين.
تُفتح اللوحة تلقائيًا ما لم يكن عرض المحرر أقل من 640 بكسل عند فتح علامة التبويب لأول مرة. يطويها Hide options في رأس اللوحة، ويعيدها Show options في أعلى يمين التعليمات البرمجية. ثم تبقى مفتوحة أو مطوية كما تركتها، عبر التبديل بين علامات التبويب، طوال فترة فتح المحرر. وتُطوى وتُفتح باستقلال عن لوحة علامة تبويب منشئ التعليمات البرمجية، ولا تُحفظ في الملف أبدًا.

فتح Export > Schema SQL، وتبديل العبارات إلى Drop & re-create والترويسة إلى USE، ثم إضافة سكربت SET NAMES قبل الجداول

انقر بزر الماوس الأيمن على نص SQL لفتح قائمة السياق الخاصة به:

  • Database وBracket، وكل منهما قائمة فرعية تضع علامة اختيار على القيمة الحالية.
  • Statements وHeader، وكل منهما قائمة فرعية تضع علامة اختيار على الخيار المطبَّق. ويحمل الخيار الذي لا تدعمه قاعدة البيانات تنويهًا باهتًا مثل not in Oracle ولا يفعل شيئًا.
  • Options panel، وعليه علامة اختيار أثناء ظهور اللوحة، ويطويها أو يفتحها.
  • Save file

أثناء فتح علامة التبويب هذه، يعرض البحث السريع Database وBracket؛ وSchema SQL: Statements وSchema SQL: Header، اللذين لا يسردان إلا الخيارات التي تدعمها قاعدة البيانات؛ وSchema SQL: Options panel، الذي يطوي اللوحة أو يفتحها.
ولا تعرض قائمة السياق ولا البحث السريع الخيار Write logical names into empty comments، الموجود في لوحة الخيارات وحدها، راجع الأسماء المنطقية كتعليقات.

يُكتب نص SQL عند فتح علامة التبويب، ثم مجددًا كلما تغيّر أحد خيارات اللوحة أو اسم قاعدة البيانات أو أحد السكربتات. أما التعديل الذي يطرأ على الجداول أثناء فتح علامة التبويب، مثل تعديل متعاون أو وكيل برمجة، فيظهر بمجرد مغادرتك علامة التبويب والعودة إليها، أو بمجرد تغيّر أحد تلك العناصر.

تحتوي خصائص الجدول على علامة تبويب Schema SQL خاصة بها، تعرض نص DDL لجدول واحد. وتكتب دائمًا عبارات CREATE عادية دون ترويسة أو سكربتات، ولا تكتب أبدًا اسمًا منطقيًا في تعليق فارغ، ولا تحتوي على لوحة خيارات، ولا تعرض قائمة السياق فيها سوى Database وBracket.

لوحة الخيارات​

تضم اللوحة ثلاثة أقسام، كل منها تحت عنوان:

  1. Saved in the document: Database وBracket، راجع قاعدة البيانات وعلامات الاقتباس. ويعنونهما المحرر للقراءة فقط بـThis window only، راجع وضع القراءة فقط.
  2. This window only: Statements وHeader وWrite logical names into empty comments، وTables ما دام المخطط يحتوي على مجموعة جداول، راجع العبارات والترويسة والأسماء المنطقية كتعليقات والجداول.
  3. Saved in the document · written as is for every database: السكربتان Before tables وAfter tables، راجع السكربتات قبل الجداول وبعدها.

يقع Save file وCopy في أسفلها، راجع حفظ نص SQL أو نسخه.

تنتمي الخيارات ضمن This window only إلى نافذة المحرر التي تختارها فيها. فهي لا تُحفظ في المستند، ولا تُشارَك مع المتعاونين، ولا تُسجَّل للتراجع، وتعود إلى قيمها الأولية عند إغلاق المحرر أو إعادة تحميله؛ أما التبديل بين علامات التبويب فيُبقيها.
يبدأ Statements بالقيمة If not exists، وHeader بالقيمة CREATE + USE، وWrite logical names into empty comments معطّلًا. أما نص SQL الذي تقرؤه صفحة تضمّن المحرر باستخدام الدالة getSchemaSQL()، ونص SQL الذي يقرؤه وكيل البرمجة، فيبدآن بدلًا من ذلك بالقيمة Create ودون ترويسة، ولا يكتبان أي أسماء منطقية ما لم يُطلب منهما ذلك.

يبقى الخيار الذي لا تدعمه قاعدة البيانات المحددة في اللوحة باهتًا، مع التلميح Not in <database>، مثل Not in Oracle، والضغط عليه لا يفعل شيئًا.
عندئذ يستخدم نص SQL أقرب صيغة تدعمها قاعدة البيانات، ويظهر زر تلك الصيغة مضغوطًا: يرجع If not exists إلى Create، وCREATE + USE إلى USE، أو إلى None حيث لا تدعم قاعدة البيانات USE أيضًا، وUSE إلى None. ويُحتفظ باختيارك، لذا فإن التبديل إلى قاعدة بيانات تدعمه يعيده.

قاعدة البيانات وعلامات الاقتباس​

Database هو قاعدة بيانات المخطط، وهو الإعداد نفسه الذي يغيّره Database في قائمة السياق للوحة الرسم وفي منشئ التعليمات البرمجية، راجع قواعد البيانات. ويسرد Databricks وMSSQL وMariaDB وMySQL وOracle وPostgreSQL وSnowflake وSQLite، وقيمته الأولية MySQL، ويُحفظ في الملف كأي تعديل.

يحدد Bracket علامة الاقتباس التي تحيط بأسماء الجداول والأعمدة والقيود والفهارس: SingleQuote أو DoubleQuote أو Backtick أو None لعدم الاقتباس إطلاقًا، وهو الخيار الافتراضي. وهو الإعداد نفسه الذي في منشئ التعليمات البرمجية، راجع علامات الاقتباس.
ويستخدم Snowflake، الذي لا يقتبس الأسماء إلا بعلامات الاقتباس المزدوجة، هذه العلامات مع أي خيار عدا None، بينما يقتبس Databricks الأسماء دائمًا بعلامات الاقتباس المائلة.
لا يُحفظ Bracket في الملف إلا ما دام القفل Bracket Type في علامة تبويب الإعدادات معطّلًا، وتكون كل الأقفال مفعّلة في المخطط الجديد. وأثناء تفعيل القفل، يعيد التغيير كتابة نص SQL في محررك وحده: فتحتفظ المحررات الأخرى المفتوحة على المخطط بعلامات الاقتباس التي لديها، ويحتفظ الملف بالقيمة المقفلة، لذا يُعاد فتح المخطط بها، راجع القفل.

عندما تكون قاعدة البيانات Oracle ويحتوي نص SQL على اسم أطول من 30 بايت، وهو ما يرفضه Oracle 12.1 وما قبله، يسرد تنويه أسفل القائمتين كل اسم من هذا النوع: Oracle 12.2+ for names over 30 bytes: <names>. ويشمل الفحص أسماء الجداول والأعمدة والمخططات والمفاتيح والفهارس والتسلسلات والمشغّلات. ولا يتغير نص SQL نفسه.

العبارات​

يحدد Statements طريقة إنشاء الجداول:

  • يكتب Create عبارات CREATE عادية.
  • يتخطى If not exists الجداول والفهارس الموجودة بالفعل. ويدعمه MySQL وMariaDB وPostgreSQL وSQLite وDatabricks؛ بينما يكتب MSSQL وOracle وSnowflake Create بدلًا منه.
    • يكتب MySQL كل جدول بصيغة CREATE TABLE IF NOT EXISTS مع قيوده الفريدة وفهارسه ومفاتيحه الخارجية داخله، ويضع الدفعة كلها بين SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; وSET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;.
    • يضع MariaDB IF NOT EXISTS في كل عبارة: في CREATE TABLE، وفي كل قيد UNIQUE وFOREIGN KEY، وفي كل CREATE INDEX.
    • يكتب PostgreSQL CREATE TABLE IF NOT EXISTS وCREATE INDEX IF NOT EXISTS، ويحذف كل مفتاح خارجي باستخدام DROP CONSTRAINT IF EXISTS قبل إضافته مجددًا.
    • يكتب SQLite CREATE TABLE IF NOT EXISTS وCREATE INDEX IF NOT EXISTS.
    • يكتب Databricks CREATE TABLE IF NOT EXISTS، ويحذف كل مفتاح خارجي باستخدام DROP CONSTRAINT IF EXISTS قبل إضافته مجددًا.
  • يحذف Drop & re-create كل الجداول التي يكتبها قبل إنشائها مجددًا، إلا في Snowflake. وتدعمه كل قواعد البيانات:
    • يكتب MySQL وMariaDB عبارة DROP TABLE IF EXISTS لكل جدول، بين السطرين نفسيهما اللذين يعطّلان فحص المفاتيح الخارجية ثم يعيدان تفعيله.
    • يكتب PostgreSQL عبارة DROP TABLE IF EXISTS واحدة تسمّي كل الجداول، وتفشل إذا كان جدول خارج القائمة يشير إلى أحدها. ومع الترويسة CREATE + USE، يُحذف الجدول الذي لا يحدد اسمه مخططًا من ذلك المخطط، مثل shop.member.
    • يكتب MSSQL معاملة واحدة تتطلب SQL Server 2016 أو أحدث، كما يذكر تلميح الزر SQL Server 2016+. وتحذف المعاملة المفاتيح الخارجية التي تحملها الجداول المكتوبة، ثم الجداول بعبارة DROP TABLE IF EXISTS واحدة، وتُلغي تغييراتها عند حدوث خطأ. ولا يزال المفتاح الخارجي الذي يحمله جدول خارج القائمة يمنع الحذف.
    • يكتب SQLite PRAGMA foreign_keys=OFF;، الذي يُبقي المفاتيح الخارجية معطّلة لذلك الاتصال، ثم عبارة DROP TABLE IF EXISTS لكل جدول.
    • يكتب Oracle DROP TABLE … CASCADE CONSTRAINTS لكل جدول وDROP SEQUENCE لكل تسلسل تزايد تلقائي، وكل عبارة منها في كتلة PL/SQL تنتهي بسطر / وتتجاوز الخطأ الناتج عن جدول أو تسلسل غير موجود.
    • يكتب Databricks عبارة DROP TABLE IF EXISTS لكل جدول.
    • لا يحذف Snowflake شيئًا، ويكتب CREATE OR REPLACE TABLE بدلًا من ذلك.

أثناء تطبيق Drop & re-create، يسمّي تحذير في اللوحة الجداول التي يحذفها: Drops <tables> before creating them. Their rows are lost.، أو في Snowflake Replaces <tables>. Their rows are lost.
تُذكر أسماء ما يصل إلى خمسة جداول كاملة. وإذا تجاوز عددها خمسة، يسمّي التحذير أول أربعة ويعدّ الباقي، مثل a, b, c, d, and 3 more tables.

يفتتح Header نص SQL بالعبارات التي تُنشئ أو تحدد قاعدة البيانات، أو المخطط، الذي يُنفَّذ فيه. والاسم هو اسم قاعدة البيانات الخاص بالمخطط، الذي يُكتب في الحقل database name في شريط الأدوات، ويُحاط بعلامة الاقتباس المحددة في Bracket.

  • MySQL وMariaDB: يكتب USE العبارة USE shop;، ويكتب CREATE + USE العبارة CREATE DATABASE IF NOT EXISTS shop; قبلها.
  • MSSQL: يكتب USE السطرين USE shop وGO، ويكتب CREATE + USE السطرين IF DB_ID(N'shop') IS NULL CREATE DATABASE shop وGO قبلهما.
  • لا يدعم PostgreSQL سوى CREATE + USE، الذي يكتب CREATE SCHEMA IF NOT EXISTS shop; وSET search_path TO shop, public;.
  • لا يدعم Oracle سوى USE، الذي يكتب ALTER SESSION SET CURRENT_SCHEMA = shop;. ويرجع CREATE + USE إليه، لذا فهذا هو السطر الذي يكتبه Oracle مع الترويسة الافتراضية لعلامة التبويب.
  • Snowflake وDatabricks: يكتب USE العبارة USE SCHEMA shop;، ويكتب CREATE + USE العبارة CREATE SCHEMA IF NOT EXISTS shop; قبلها.
  • لا يدعم SQLite أيًّا منهما، ولا يكتب أي ترويسة.

حيث تدعم قاعدة البيانات USE أو CREATE + USE، يذكر تلميح الزر ما يكتبه فيها، مثل CREATE SCHEMA + SET search_path في PostgreSQL.

لا تُكتب الترويسة إلا ما دام اسم قاعدة البيانات معرّفًا بسيطًا: حرف ASCII (A–Z، a–z) أو _، تليه أحرف ASCII أو أرقام أو _.
أي اسم آخر، بما في ذلك الاسم الفارغ، لا تُكتب معه أي ترويسة، وعندئذ لا تسمّي عبارة DROP TABLE في PostgreSQL أي مخطط. وأثناء تطبيق ترويسة غير None، ينبّه إلى ذلك تنويه أسفل Header: Database name "<name>" is not a valid identifier.
اسم قاعدة البيانات في المخطط الجديد فارغ، لذا تعرض اللوحة، إلى أن تسمّيها، Database name "" is not a valid identifier.

الأسماء المنطقية كتعليقات​

يكتب Write logical names into empty comments، وهو مفتاح تبديل ضمن This window only، الاسم المنطقي للجدول أو العمود في نص DDL حيث يكون تعليقه فارغًا، في كل قواعد البيانات.

تفعيل Write logical names into empty comments في لوحة مخطط SQL، مما يكتب الاسم المنطقي لكل عمود من أعمدة order_items في COMMENT الفارغ الخاص به، بينما تبقى تعليقات members كما هي

  • التعليق الذي يحتوي على نص يغلب دائمًا: لا يحل الاسم المنطقي محله أبدًا ولا يُضاف إليه أبدًا.
  • يُعدّ التعليق الذي لا يحوي إلا مسافات فارغًا، لذا يُكتب الاسم المنطقي مكانه. أما الاسم المنطقي الفارغ أو الذي لا يحوي إلا مسافات فلا يكتب شيئًا، ويبقى ذلك الجدول أو العمود دون تعليق.
  • يُكتب الاسم المنطقي في الموضع وبالصيغة اللذين تكتب بهما قاعدة البيانات التعليق، مع تهريب علامات الاقتباس فيه بالطريقة نفسها، راجع التعليقات.

في MySQL مثلًا، يُكتب العمود id الذي اسمه المنطقي Member ID ولا تعليق له مع COMMENT 'Member ID'، بينما يبقى العمود email الذي اسمه المنطقي Email وتعليقه Sign-in address مكتوبًا مع COMMENT 'Sign-in address'.

وكما في Statements وHeader، ينتمي مفتاح التبديل إلى النافذة ويبدأ معطّلًا، راجع لوحة الخيارات.
لا يقرأ أي استيراد مثل هذا التعليق على أنه اسم منطقي، راجع التعليقات.

الجداول​

ما دام المخطط يحتوي على مجموعة جداول واحدة على الأقل، ظاهرة أو مخفية، يظهر Tables ضمن This window only مع خانة اختيار لكل خيار:

  • All، الذي يحدد كل الخانات أو يلغي تحديدها. ويعرض حالة مختلطة عندما لا يكون إلا بعضها محددًا.
  • خانة لكل مجموعة جداول، بترتيب المجموعات في المخطط، تحمل اسم المجموعة، أو unnamed للمجموعة التي لا اسم لها، بعد نقطة بلون المجموعة إن كان لها لون.
  • No group، للجداول التي لا تنتمي إلى أي مجموعة.

عند تحديد كل الخانات، تكتب علامة التبويب المخطط بأكمله.
وعند تحديد بعضها فقط، تكتب جداول الخانات المحددة مع فهارسها والمفاتيح الخارجية التي تحملها، بما في ذلك المفتاح الذي يشير إلى جدول مستبعد. ولا يزال سكربتا ما قبل الجداول وما بعدها يُكتبان، ولا يشمل Drop & re-create وتحذيره وتنويه Oracle بشأن الأسماء الطويلة سوى تلك الجداول.
وعند عدم تحديد أي خانة، لا تكتب علامة التبويب شيئًا، وتظهر فوق التعليمات البرمجية رسالة نصها No tables chosen. Check some under Tables. وعندئذ يحفظ Save file ملفًا فارغًا، وينسخ Copy نصًا فارغًا.

وكما في Statements وHeader، ينتمي هذا الاختيار إلى النافذة، راجع لوحة الخيارات.
لا تبدأ المجموعة المضافة لاحقًا محددةً إلا إذا كانت كل الخانات محددة في تلك اللحظة. وتؤدي إزالة مجموعة إلى إزالة خانتها، وتؤدي إزالة آخر مجموعة إلى تحديد كل شيء مجددًا.
ينطبق هذا الاختيار على علامة التبويب هذه وحدها. ولا تتأثر به علامة التبويب Schema SQL في خصائص الجدول ولا الدالة getSchemaSQL().

السكربتات قبل الجداول وبعدها​

يحتوي Before tables وAfter tables على نص SQL خاص بك، مثل عبارات CREATE EXTENSION أو SET قبل الجداول، أو منح الصلاحيات وطرق العرض والبيانات الأولية بعدها.
ويُحفظان في المستند، زوجًا واحدًا للمخطط بأكمله أيًّا كانت قاعدة البيانات. ويُكتب كل منهما في نص SQL كما كتبته، دون أي فحص: سكربت ما قبل الجداول بعد الترويسة وقبل عبارات DROP والجداول، وسكربت ما بعد الجداول في النهاية تمامًا.

تُكتب فواصل الأسطر بصيغة LF، وتُحذف الأسطر الفارغة التي تسبق السكربت والمسافات البيضاء التي تليه.
في MSSQL، يُضاف سطر GO بعد السكربت الذي لا يكون سطره الأخير GO (أو GO متبوعًا بعدد)، كما يذكر السطر الموجود أسفل الحقلين. وفي Oracle، أنهِ كتلة PL/SQL بسطر / الخاص بها بنفسك.

يطبّق الحقلان تمييز صيغة SQL، ويتمددان مع نصهما.
يُطبَّق التعديل عندما تغادر الحقل، بالنقر في مكان آخر أو بالتبديل بين علامات التبويب، وعندئذ فقط يتغير نص SQL المجاور له والمستند. والحقل الذي اكتفيت بالنقر داخله لا يغيّر شيئًا.
يغيّر تعديل السكربت المخطط كأي تعديل آخر: فهو يُحفظ في الملف، ويراه المتعاونون، ويمثل كل تعديل مُطبَّق خطوة واحدة في سجل التراجع، تتراجع عنها من علامة تبويب ERD.
أثناء الكتابة في حقل، تُترك له اختصارات المحرر نفسه، لذا يتراجع Ctrl + Z (Windows/Linux) أو ⌘ + Z (Mac) عما كتبته فيه، ويعمل النسخ والقص واللصق على النص بدلًا من المخطط.
ومع ذلك يُفتح البحث السريع وبحث المستكشف باختصاريهما، Ctrl + K وCtrl + F (Windows/Linux) أو ⌘ + K و⌘ + F (Mac). ولأن Ctrl + F أو ⌘ + F ينتقل إلى علامة تبويب ERD، فإنه يطبّق تعديلك، كما يفعل أي تبديل بين علامات التبويب.
يتابع الحقل الذي ليس عليه تركيز لوحة المفاتيح أي تغيير يجريه متعاون أو وكيل برمجة على السكربت الخاص به. أما الحقل الذي أنت فيه فيعرض ذلك التغيير عندما تغادره دون أن تكتب شيئًا. وإذا كتبت، يُطبَّق نصك عند المغادرة ويحل محل نصهم.

حفظ نص SQL أو نسخه​

يحفظ Save file، في أسفل اللوحة أو في قائمة السياق، نص SQL الذي تعرضه علامة التبويب كما هو تمامًا، بقاعدة بياناته وعلامات اقتباسه وعباراته وترويسته وتعليقات الأسماء المنطقية وجداوله وسكربتاته الحالية، باسم <database name>-<timestamp>.sql. ويُسمّى ويُحفظ كأي تصدير آخر، راجع التصدير.

لا يحفظ Export ▸ Schema SQL، في قائمة السياق للوحة الرسم أو في البحث السريع، شيئًا بنفسه.
بل ينتقل إلى علامة التبويب هذه، ويفتح لوحة الخيارات حتى لو كانت مطوية، ويضع تركيز لوحة المفاتيح على Save file، لذا يحفظ الضغط على Enter الملف.

ينسخ Copy في أسفل اللوحة، أو زر النسخ الذي يظهر في أعلى يمين التعليمات البرمجية أثناء وضع المؤشر فوقها، نص SQL.
يؤكد ذلك إشعار منبثق Copied! مع علامة اختيار لمدة ثانيتين. وإذا رفض المتصفح أو المضيف الوصول إلى الحافظة، يُعلم بذلك بدلًا منه إشعار منبثق Couldn't copy to the clipboard مع علامة تحذير، لمدة خمس ثوانٍ. ويستبدل النسخ مجددًا الإشعار المنبثق بدلًا من إضافة إشعار آخر.
ويمكن أيضًا تحديد نص SQL، لذا يمكنك أخذ جزء منه فقط.

ما يُكتب في DDL​

تسري هذه القواعد أينما كتب المحرر مخطط SQL: في علامة التبويب هذه وفي ملفها، وفي نص SQL الذي تقرؤه صفحة تضمّن المحرر أو يقرؤه وكيل برمجة.
وتتبعها علامة التبويب Schema SQL في خصائص الجدول للجدول الواحد الذي تعرضه. ولا تكتب أي تسلسل أو مشغّل في Oracle، ولا أي مفاتيح خارجية باستثناء مفاتيح SQLite، التي تقع داخل عبارة CREATE TABLE الخاصة بالجدول. ولا تكتب كذلك عبارات التعليق التي يضعها PostgreSQL وOracle وMSSQL بعد الجدول، لذا لا تعرض أي تعليقات في قواعد البيانات الثلاث هذه.

تأتي الأجزاء بهذا الترتيب، يفصل بين كل جزأين سطر فارغ: الترويسة، وسكربت ما قبل الجداول، وعبارات DROP، والجداول، وسكربت ما بعد الجداول. وتُكتب الجداول بترتيب أسمائها.
لا يُكتب شيء لمخطط لا جداول فيه ولا سكربتات، حتى مع اختيار ترويسة.

تُكتب الجداول والأعمدة بأسمائها المادية، أيًا كان ما يعرضه عرض الأسماء. ويُكتب العمود المرتبط بمجال بنوع بياناته الخاص، الذي يحدده المجال، راجع المجالات وأنواع البيانات.

التزايد التلقائي​

يُكتب العمود الذي يحمل العلامة Auto Increment بالطريقة التي تكتبه بها كل قاعدة بيانات: AUTO_INCREMENT في MySQL وMariaDB، وIDENTITY(1,1) في MSSQL، وAUTOINCREMENT في Snowflake، وGENERATED ALWAYS AS IDENTITY في PostgreSQL وDatabricks.
ويحصل Oracle على تسلسل SEQ_<table> ومشغّل SEQ_TRG_<table> يملأ العمود منه. وينتهي المشغّل بسطر /، لذا يشغّله SQL*Plus وSQLcl.

حيث لا تقبل قاعدة البيانات التزايد التلقائي على نوع بيانات العمود، يُستبعد البند، ويسمّي سطر تعليق بعد الجدول العمودَ:

  • لا يقبله PostgreSQL إلا على smallint أو integer أو bigint، بأي من أسمائها: INT أو INTEGER أو BIGINT أو SMALLINT أو INT2 أو INT4 أو INT8. ولا يحصل العمود من نوع آخر على البند ولا على قيمة افتراضية، ويكون نص التعليق مثلًا -- PostgreSQL takes IDENTITY only on smallint, integer or bigint, so member.id is written without it.
  • لا يقبله Databricks إلا على BIGINT أو LONG.
  • لا يقبل SQLite AUTOINCREMENT إلا على عمود المفتاح الأساسي الوحيد في الجدول إذا كان من نوع عدد صحيح، مثل INT أو BIGINT أو INT8، مع تحديد عرض أو دونه. ويُكتب ذلك العمود بصيغة INTEGER، والمفتاح بصيغة PRIMARY KEY (id AUTOINCREMENT). ويُكتب المفتاح الوحيد من أي نوع آخر دونه.

الإجراءات المرجعية​

إجراءات ON DELETE وON UPDATE التي تكتبها كل قاعدة بيانات مسرودة في ON DELETE وON UPDATE.
وحيث يستبعد Snowflake إجراءً ما، يسمّيه تعليق فوق عبارة ALTER TABLE الخاصة بذلك المفتاح الخارجي، مثل -- Snowflake creates no foreign key with a referential action other than NO ACTION, so ON DELETE CASCADE is left out.

أسماء الجداول المؤهلة بالمخطط​

عند ضبط Bracket على None، يُقرأ اسم الجدول الذي يحتوي على نقطة، مثل sales.users، على أنه مخطط وجدول، ويُقسم عند آخر نقطة فيه خارج الأقواس المربعة أو علامات الاقتباس المزدوجة.

  • يبني MySQL وMariaDB وMSSQL وOracle وPostgreSQL الأسماء التلقائية التي يكتبها كل منها من جزء الجدول وحده: FK_users_TO_orders وIDX_users في الخمسة جميعًا، وUQ_users_email فيها جميعًا عدا PostgreSQL، وPK_users في MSSQL وOracle، وهما الوحيدان بينها اللذان يسمّيان المفتاح الأساسي. وفيهما، يعطي [sales].[users] و"sales"."users" الاسم PK_users أيضًا، ويعطي [Order] الاسم PK_Order.
  • لا يسمّي SQLite أي قيود، لذا فالاسم التلقائي الوحيد الذي يبنيه هو اسم الفهرس: CREATE INDEX sales.IDX_users ON users.
  • يُنشئ Oracle فهارس الجدول، وتسلسل عمود التزايد التلقائي ومشغّله، في مخطط الجدول: sales.IDX_users وsales.SEQ_users وsales.SEQ_TRG_users.
  • في Oracle وSQLite، يحتفظ اسم الفهرس الذي حددت له مخططًا بنفسك بذلك المخطط.
  • يحصل اسم المفتاح الخارجي أو الفهرس التلقائي الذي يكرر اسمًا سابقًا، دون مراعاة حالة الأحرف، على رقم. فعندما يشير orders إلى كلٍّ من sales.users وhr.Users، يكون المفتاح الثاني FK_Users_TO_orders1.

مع أي خيار آخر في Bracket، يكون اسم الجدول كله معرّفًا واحدًا، مثل "PK_sales.users". ويحتفظ Snowflake وDatabricks دائمًا بالاسم كاملًا.
وتعرض صفوف Keys في علامة التبويب الفهارس الأسماء نفسها.

القيم الافتراضية​

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

  • يحيط MySQL بالأقواس كل شيء عدا القيمة الحرفية أو الوقت الحالي، مثل (uuid()). كما يحيط بها أي قيمة افتراضية عدا NULL على عمود من نوع BLOB أو TEXT أو JSON أو نوع مكاني أو LONG…، والوقت الحالي على أي عمود ليس من نوع TIMESTAMP أو DATETIME.
  • يحيط MariaDB بالأقواس كل شيء عدا القيمة الحرفية أو الوقت الحالي أو استدعاء الدالة أو الاسم.
  • يحيط SQLite بالأقواس كل شيء عدا القيمة الحرفية أو الاسم، مثل (datetime('now')).
  • لا يحيط PostgreSQL بالأقواس إلا التعبير الذي يحتوي خارج الأقواس على كلمة مثل AT TIME ZONE أو AND أو OR أو IS أو IN أو LIKE أو COLLATE أو = ANY، مثل (now() AT TIME ZONE 'utc').
  • يكتب MSSQL وOracle وSnowflake وDatabricks كل قيمة افتراضية كما كُتبت.

التعليقات​

يُكتب تعليق الجدول أو العمود غير الفارغ، أو الاسم المنطقي الذي يكتبه Write logical names into empty comments مكانه، بالطريقة التي تكتب بها كل قاعدة بيانات التعليقات:

  • يكتبه MySQL وMariaDB مضمّنًا: ينتهي العمود بالبند COMMENT 'Member ID'، ويُغلق الجدول بالسطر ) COMMENT 'Members';، وكذلك في دفعة If not exists في MySQL.
  • يكتب Snowflake تعليق العمود مضمّنًا، COMMENT 'Member ID'، وتعليق الجدول في سطر مستقل بعد القوس الختامي، COMMENT = 'Members';.
  • يكتب Databricks تعليق العمود مضمّنًا، وتعليق الجدول بصيغة COMMENT 'Members'; بعد USING DELTA.
  • يكتب PostgreSQL COMMENT ON TABLE member IS 'Members'; وCOMMENT ON COLUMN member.id IS 'Member ID'; مباشرةً بعد عبارة CREATE TABLE الخاصة بالجدول. ويكتب Oracle العبارات نفسها بعد الجدول وقيوده الفريدة وتسلسل التزايد التلقائي ومشغّله.
  • يكتب MSSQL استدعاءً واحدًا لكل جدول ولكل عمود، بعد الجدول وقيوده الفريدة، يتبع كلًّا منها GO: EXECUTE sys.sp_addextendedproperty 'MS_Description', N'Members', 'schema', 'dbo', 'table', 'member'، مع إضافة 'column', 'id' للعمود.
    النص سلسلة حرفية وطنية، N'…'، لذا يحتفظ SQL Server بالنص الواقع خارج صفحة الترميز الخاصة بقاعدة البيانات، مثل النص الكوري، بدلًا من تخزين علامات استفهام.
    عند ضبط Bracket على None، يعطي الجدول المسمّى sales.users المخطط sales والجدول users، وكذلك يفعل [sales].[users] و"sales"."users"، اللذان تُحذف أقواسهما المربعة وعلامات اقتباسهما المزدوجة. والاسم الذي لا مخطط فيه يقع في dbo. أما الجزء الذي يسبق المخطط، كما في shop.sales.users، فيشغّل إجراء قاعدة البيانات تلك، shop.sys.sp_addextendedproperty. ومع أي خيار آخر في Bracket يكون الاسم كله هو الجدول، في dbo.
  • لا يحتفظ SQLite بالتعليقات، لذا يكتب كل تعليق على هيئة سطر -- فوق ما يصفه: -- Members فوق CREATE TABLE member، و-- Member ID فوق العمود.

تُضاعَف علامة الاقتباس داخل التعليق المقتبس، كما في 'it''s' وN'it''s'، وكذلك العلامة الموجودة في الأسماء التي تمررها استدعاءات MSSQL. أما Databricks فيهرّب علامة الاقتباس والشرطة المائلة العكسية بشرطة مائلة عكسية بدلًا من ذلك، كما في 'it\'s'، وهي الصيغة التي يقرؤها كل إصدار من Spark. ولا تُقتبس أسطر -- في SQLite، لذا تحتفظ بعلامة الاقتباس كما كُتبت: -- it's.
وفيما عدا ذلك يُكتب النص كما كُتب، بما في ذلك فواصل الأسطر، إلا في قاعدتي بيانات:

  • يستبعد Oracle الأسطر الفارغة، ويُعدّ السطر الذي لا يحوي إلا مسافات أو علامات جدولة فارغًا، لأن SQL*Plus ينهي العبارة عند السطر الفارغ ويتخطى ما تبقى منها. فتعليق الجدول المكوّن من Members وسطر فارغ وActive only يُكتب بصيغة COMMENT ON TABLE member IS 'Members مع Active only'; في السطر التالي.
  • يكتب SQLite كل سلسلة متتالية من فواصل الأسطر على هيئة مسافة واحدة، لأن فاصل السطر سينهي سطر -- ويشغّل الباقي على أنه SQL. ويُكتب التعليق نفسه بصيغة -- Members Active only.

طريقة قراءة هذه التعليقات عند الاستيراد موضّحة في التعليقات.

وضع القراءة فقط​

في محرر بالسمة readonly تعمل علامة التبويب للقارئ، ولا يصل شيء مما يُجرى عليها إلى المستند:

  • لا يزال Database وBracket يعيدان كتابة SQL، لكن في تلك النافذة وحدها، لذا تعنونهما اللوحة بـThis window only أيضًا. ولا يُحفظ الاختيار في الملف ولا يُشارَك مع المتعاونين ولا يُسجَّل للتراجع، أيًّا كانت الأقفال، ولا يغيّر تغيير أي متعاون لإعداد اخترتَه ما اخترتَه على الشاشة. وتعرض علامة تبويب منشئ التعليمات البرمجية الاختيار نفسه، وتكتبه getSchemaSQL() حين تُستدعى دون قاعدة بيانات. وحين يعود المحرر قابلًا للكتابة تعود قاعدة البيانات وعلامات الاقتباس اللتان اخترتهما إلى ما كان المحرر يعرضه من قبل، مع أي تغيير أجراه متعاون منذ ذلك الحين، راجع وضع القراءة فقط في الإعدادات.
  • يعمل Statements وHeader وWrite logical names into empty comments وTables كما تعمل في أي مكان، لأنها تخص النافذة أصلًا.
  • حقلا السكربت للقراءة فقط: يعرضان سكربتَي المستند، اللذين يكتبهما SQL ما زال، ولا يقبلان كتابة.
  • يحفظ Save file وCopy نص SQL الذي تعرضه علامة التبويب وينسخانه.