Схема SQL
Вкладка Schema SQL показує DDL-код діаграми для вибраної бази даних: SQL, що створює її таблиці разом із їхніми ключами, індексами та зовнішніми ключами.
Перейдіть на вкладку Schema SQL на панелі інструментів або виберіть Schema SQL у підменю Tab швидкого пошуку. Вибір Schema SQL у підменю Export теж відкриває її, одразу готову до збереження, — див. збереження або копіювання SQL.
SQL розташовано ліворуч, а праворуч від нього панель параметрів із заголовком Schema SQL містить варіанти, які визначають його вигляд, — див. панель параметрів. Коли вибрано мову інтерфейсу з письмом справа наліво, SQL так само лишається ліворуч і читається зліва направо.
Панель відкривається сама, якщо тільки редактор не вужчий за 640 px у момент першого відкриття вкладки. Кнопка Hide options у заголовку панелі згортає її, а Show options у верхньому правому куті коду повертає її. Далі вона лишається відкритою чи згорнутою, як ви її залишили, і після перемикання вкладок, доки редактор відкрито. Вона згортається й відкривається незалежно від панелі вкладки генератора коду та ніколи не зберігається у файлі.

Клацніть SQL правою кнопкою миші, щоб відкрити його контекстне меню:
DatabaseіBracket— підменю, у кожному з яких позначено поточне значення.StatementsіHeader— підменю, у кожному з яких позначено варіант, що діє. Біля варіанта, якого база даних не має, стоїть приглушена примітка, як-отnot in Oracle, і такий варіант нічого не робить.Options panel, який позначено, поки панель показано, і який згортає або відкриває її.Save file
Поки ця вкладка відкрита, швидкий пошук пропонує Database і Bracket; Schema SQL: Statements і Schema SQL: Header, які перелічують лише варіанти, наявні в базі даних; а також Schema SQL: Options panel, що згортає або відкриває панель.
SQL генерується під час відкриття вкладки й заново щоразу, коли змінюється один із параметрів панелі, назва бази даних або скрипт. Зміна таблиць, зроблена, поки вкладку відкрито, як-от зміна співавтора чи агента для програмування, з’являється, щойно ви покинете вкладку й повернетеся до неї або щойно зміниться щось із названого вище.
У вікні властивостей таблиці є власна вкладка Schema SQL, яка показує DDL-код однієї таблиці. Вона завжди записує прості оператори CREATE без заголовка й скриптів, не має панелі параметрів, а її контекстне меню пропонує лише Database і Bracket.
Панель параметрів
Панель містить три групи, кожна з яких має свій підпис:
Saved in the document:DatabaseіBracket— див. база даних і лапки.This window only:Statements,Headerі, поки діаграма має групу таблиць,Tables— див. оператори, заголовок і таблиці.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. Натомість 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, перш ніж додати його знову.
- MySQL записує кожну таблицю як
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.
- MySQL і MariaDB записують
Поки діє 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.
Таблиці
Поки діаграма має хоча б одну групу таблиць, показану чи приховану, у групі This window only з’являється Tables із прапорцем для кожного варіанта:
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 у вікні властивостей таблиці дотримується їх для тієї однієї таблиці, яку показує. Вона не записує ні зовнішніх ключів, крім ключів SQLite, що містяться всередині її CREATE TABLE, ні послідовності чи тригера Oracle.
Частини йдуть у такому порядку, розділені одним порожнім рядком: заголовок, скрипт перед таблицями, оператори 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 записують кожне типове значення так, як його введено.
Режим лише для читання
У редакторі з атрибутом readonly вкладка працює як зазвичай: Database і Bracket так само змінюють показаний SQL, Statements, Header та Tables так само працюють, а Save file і Copy, як і раніше, зберігають і копіюють його.
Доступними лише для читання стають тільки два поля скриптів.