Schema SQL
La scheda Schema SQL mostra il DDL del diagramma per il database selezionato: il codice SQL che ne crea le tabelle con chiavi, indici e chiavi esterne.
Passare alla scheda Schema SQL nella barra degli strumenti o scegliere Schema SQL sotto Tab nella Ricerca rapida. Anche la scelta di Schema SQL dal sottomenu Export apre la scheda, pronta per il salvataggio — vedere Salvare o copiare il codice SQL.
Il codice SQL si trova a sinistra e, alla sua destra, un pannello opzioni intitolato Schema SQL raccoglie le scelte che lo determinano — vedere Pannello opzioni. Anche con una lingua di visualizzazione da destra a sinistra, il codice SQL resta a sinistra e si legge da sinistra a destra.
Il pannello si apre da solo, a meno che l’editor non sia più stretto di 640 px alla prima apertura della scheda. Hide options nell’intestazione del pannello lo comprime e Show options in alto a destra nel codice lo riapre. Da quel momento resta aperto o compresso come lo si è lasciato, anche cambiando scheda, finché l’editor resta aperto. Si comprime e si apre indipendentemente dal pannello della scheda Generatore di codice e non viene mai salvato nel file.

Fare clic con il pulsante destro sul codice SQL per aprirne il menu contestuale:
DatabaseeBracket, ciascuno un sottomenu che mostra il segno di spunta sul valore corrente.StatementseHeader, ciascuno un sottomenu che mostra il segno di spunta sulla scelta applicata. Una scelta che il database non prevede reca una nota attenuata comenot in Oraclee non ha alcun effetto.Options panel, con il segno di spunta mentre il pannello è visibile, che lo comprime o lo apre.Save file
Mentre questa scheda è aperta, la Ricerca rapida offre Database e Bracket; Schema SQL: Statements e Schema SQL: Header, che elencano solo le scelte previste dal database; e Schema SQL: Options panel, che comprime o apre il pannello.
Il codice SQL viene scritto all’apertura della scheda e di nuovo ogni volta che cambia una delle scelte del pannello, il nome del database o uno script. Una modifica apportata alle tabelle mentre la scheda è aperta, come quella di un collaboratore o di un agente di programmazione, compare quando si esce dalla scheda e vi si ritorna, o quando cambia uno di questi elementi.
Proprietà tabella ha una propria scheda Schema SQL, che mostra il DDL di una singola tabella. Scrive sempre semplici istruzioni CREATE senza intestazione né script, non ha un pannello opzioni e il suo menu contestuale offre solo Database e Bracket.
Pannello opzioni
Il pannello contiene tre gruppi, ciascuno sotto un’etichetta:
Saved in the document:DatabaseeBracket— vedere Database e delimitatore.This window only:Statements,Headere, finché il diagramma contiene un gruppo di tabelle,Tables— vedere Istruzioni, Intestazione e Tabelle.Saved in the document · written as is for every database: gli scriptBefore tableseAfter tables— vedere Script prima e dopo le tabelle.
Save file e Copy si trovano in fondo al pannello — vedere Salvare o copiare il codice SQL.
Le scelte sotto This window only appartengono alla finestra dell’editor in cui vengono fatte. Non vengono salvate nel documento, né condivise con i collaboratori, né registrate per l’annullamento, e vengono reimpostate quando l’editor viene chiuso o ricaricato; cambiando scheda vengono mantenute.
Inizialmente Statements è impostato su If not exists e Header su CREATE + USE. Il codice SQL che una pagina in cui è incorporato l’editor legge con getSchemaSQL() e quello letto da un agente di programmazione usano invece Create, senza intestazione.
Una scelta che il database selezionato non prevede resta nel pannello, attenuata, con il tooltip Not in <database>, ad esempio Not in Oracle, e premerla non ha alcun effetto.
Il codice SQL usa allora la forma più vicina prevista dal database, e il pulsante di quella forma appare premuto: If not exists ripiega su Create, CREATE + USE su USE, o su None se il database non prevede nemmeno USE, e USE su None. La scelta fatta viene mantenuta, quindi passando a un database che la prevede viene ripristinata.
Database e delimitatore
Database è il database del diagramma, la stessa impostazione di Database nel menu contestuale dell’area di disegno e di quella del Generatore di codice — vedere Database. Elenca Databricks, MSSQL, MariaDB, MySQL, Oracle, PostgreSQL, Snowflake e SQLite, è inizialmente impostato su MySQL e viene salvato nel file come qualsiasi modifica.
Bracket imposta il carattere di delimitazione che racchiude i nomi di tabelle, colonne, vincoli e indici: SingleQuote, DoubleQuote, Backtick o None per non delimitarli affatto, che è il valore predefinito. È la stessa impostazione del Generatore di codice — vedere Delimitatore.
Snowflake, che delimita i nomi solo con le virgolette doppie, le usa con qualsiasi scelta tranne None, e Databricks delimita sempre i nomi con gli apici inversi.
Bracket viene salvato nel file solo finché il blocco Bracket Type nella scheda Impostazioni è disattivato, e un nuovo diagramma ha tutti i blocchi attivi. Mentre il blocco è attivo, una modifica riscrive il codice SQL sullo schermo, ma il file mantiene il valore bloccato e il diagramma si riapre con quel valore — vedere Blocco.
Quando il database è Oracle e il codice SQL contiene un nome più lungo di 30 byte, che Oracle 12.1 e versioni precedenti rifiutano, una nota sotto i due elenchi indica ciascuno di questi nomi: Oracle 12.2+ for names over 30 bytes: <names>. Vengono controllati i nomi di tabelle, colonne, schemi, chiavi, indici, sequenze e trigger. Il codice SQL in sé non cambia.
Istruzioni
Statements determina come vengono create le tabelle:
Createscrive semplici istruzioniCREATE.If not existssalta le tabelle e gli indici che esistono già. MySQL, MariaDB, PostgreSQL, SQLite e Databricks lo prevedono; MSSQL, Oracle e Snowflake scrivono inveceCreate.- MySQL scrive ogni tabella come
CREATE TABLE IF NOT EXISTScon i relativi vincoli univoci, indici e chiavi esterne al suo interno, e racchiude l’intero insieme di istruzioni traSET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;eSET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;. - MariaDB aggiunge
IF NOT EXISTSa ogni istruzione: ilCREATE TABLE, ogni vincoloUNIQUEeFOREIGN KEYe ogniCREATE INDEX. - PostgreSQL scrive
CREATE TABLE IF NOT EXISTSeCREATE INDEX IF NOT EXISTS, ed elimina ogni chiave esterna conDROP CONSTRAINT IF EXISTSprima di aggiungerla di nuovo. - SQLite scrive
CREATE TABLE IF NOT EXISTSeCREATE INDEX IF NOT EXISTS. - Databricks scrive
CREATE TABLE IF NOT EXISTS, ed elimina ogni chiave esterna conDROP CONSTRAINT IF EXISTSprima di aggiungerla di nuovo.
- MySQL scrive ogni tabella come
Drop & re-createelimina tutte le tabelle che scrive prima di crearle di nuovo, tranne su Snowflake. Tutti i database lo prevedono:- MySQL e MariaDB scrivono un
DROP TABLE IF EXISTSper ogni tabella, tra le stesse due righe che disattivano e riattivano i controlli delle chiavi esterne. - PostgreSQL scrive un unico
DROP TABLE IF EXISTSche nomina tutte le tabelle, e che fallisce se una tabella non inclusa nell’elenco fa riferimento a una di esse. Con un’intestazioneCREATE + USE, una tabella il cui nome non indica uno schema viene eliminata da quello schema, ad esempioshop.member. - MSSQL scrive un’unica transazione, che richiede SQL Server 2016 o successiva, come indica il tooltip
SQL Server 2016+del pulsante. Elimina le chiavi esterne contenute nelle tabelle scritte, poi le tabelle con un unicoDROP TABLE IF EXISTS, ed esegue il rollback in caso di errore. Una chiave esterna contenuta in una tabella non inclusa nell’elenco blocca comunque l’eliminazione. - SQLite scrive
PRAGMA foreign_keys=OFF;, che lascia le chiavi esterne disattivate per quella connessione, poi unDROP TABLE IF EXISTSper ogni tabella. - Oracle scrive
DROP TABLE … CASCADE CONSTRAINTSper ogni tabella eDROP SEQUENCEper ogni sequenza di incremento automatico, ciascuno in un blocco PL/SQL che termina con una riga/e ignora l’errore generato da una tabella o da una sequenza mancante. - Databricks scrive un
DROP TABLE IF EXISTSper ogni tabella. - Snowflake non elimina nulla e scrive invece
CREATE OR REPLACE TABLE.
- MySQL e MariaDB scrivono un
Mentre è applicata l’opzione Drop & re-create, un avviso nel pannello indica le tabelle che vengono eliminate: Drops <tables> before creating them. Their rows are lost., o su Snowflake Replaces <tables>. Their rows are lost.
Fino a cinque tabelle vengono indicate per intero. Oltre cinque, l’avviso nomina le prime quattro e conta le restanti, ad esempio a, b, c, d, and 3 more tables.
Intestazione
Header fa iniziare il codice SQL con le istruzioni che creano o selezionano il database, o lo schema, in cui viene eseguito. Il nome è il nome del database del diagramma, digitato nel campo database name della barra degli strumenti, e viene delimitato con il carattere scelto in Bracket.
- MySQL e MariaDB:
USEscriveUSE shop;eCREATE + USEvi anteponeCREATE DATABASE IF NOT EXISTS shop;. - MSSQL:
USEscriveUSE shopeGO, eCREATE + USEvi anteponeIF DB_ID(N'shop') IS NULL CREATE DATABASE shopeGO. - PostgreSQL prevede solo
CREATE + USE, che scriveCREATE SCHEMA IF NOT EXISTS shop;eSET search_path TO shop, public;. - Oracle prevede solo
USE, che scriveALTER SESSION SET CURRENT_SCHEMA = shop;.CREATE + USEripiega su di esso, quindi è questa la riga che Oracle scrive con l’intestazione predefinita della scheda. - Snowflake e Databricks:
USEscriveUSE SCHEMA shop;eCREATE + USEvi anteponeCREATE SCHEMA IF NOT EXISTS shop;. - SQLite non prevede nessuno dei due e non scrive alcuna intestazione.
Dove il database prevede USE o CREATE + USE, il tooltip del pulsante indica cosa scrive in quel database, ad esempio CREATE SCHEMA + SET search_path su PostgreSQL.
Un’intestazione viene scritta solo se il nome del database è un identificatore semplice: una lettera ASCII (A–Z, a–z) o _, seguita da lettere ASCII, cifre o _.
Qualsiasi altro nome, incluso un nome vuoto, non produce alcuna intestazione, e il DROP TABLE di PostgreSQL non indica allora alcuno schema. Mentre è applicata un’intestazione diversa da None, una nota sotto Header lo segnala: Database name "<name>" is not a valid identifier.
Il nome del database di un nuovo diagramma è vuoto, quindi finché non gli si assegna un nome il pannello mostra Database name "" is not a valid identifier.
Tabelle
Finché il diagramma contiene almeno un gruppo di tabelle, visibile o nascosto, Tables compare sotto This window only con una casella di controllo per ogni scelta:
All, che seleziona o deseleziona tutte le caselle. Mostra uno stato misto quando solo alcune sono selezionate.- Una casella per ogni gruppo di tabelle, nell’ordine dei gruppi del diagramma, contrassegnata dal nome del gruppo, o da
unnamedper un gruppo che non ne ha uno, preceduto da un punto del colore del gruppo se il gruppo ha un colore. No group, per le tabelle che non appartengono ad alcun gruppo.
Con tutte le caselle selezionate, la scheda scrive l’intero diagramma.
Con solo alcune selezionate, scrive le tabelle delle caselle selezionate con i relativi indici e le chiavi esterne che contengono, inclusa una che fa riferimento a una tabella esclusa. Gli script prima e dopo le tabelle vengono comunque scritti, e Drop & re-create, il relativo avviso e la nota di Oracle sui nomi lunghi riguardano solo quelle tabelle.
Senza alcuna casella selezionata, la scheda non scrive nulla e un suggerimento sopra il codice riporta No tables chosen. Check some under Tables. Save file salva allora un file vuoto e Copy copia un testo vuoto.
Come per Statements e Header, la scelta appartiene alla finestra — vedere Pannello opzioni.
Un gruppo aggiunto in seguito è inizialmente selezionato solo se in quel momento tutte le caselle erano selezionate. Rimuovendo un gruppo si rimuove la sua casella, e rimuovendo l’ultimo gruppo tutto torna selezionato.
La scelta vale solo per questa scheda. La scheda Schema SQL di Proprietà tabella e getSchemaSQL() non ne risentono.
Script prima e dopo le tabelle
Before tables e After tables contengono codice SQL scritto dall’utente, come istruzioni CREATE EXTENSION o SET prima delle tabelle, o concessioni di privilegi, viste e dati iniziali dopo di esse.
Vengono salvati nel documento, una sola coppia per l’intero diagramma qualunque sia il database. Ciascuno viene inserito nel codice SQL così come è stato digitato, senza mai essere controllato: lo script prima delle tabelle va dopo l’intestazione e prima delle istruzioni DROP e delle tabelle, quello dopo le tabelle alla fine di tutto.
Le interruzioni di riga vengono scritte come LF, e le righe vuote prima di uno script e gli spazi vuoti dopo di esso vengono rimossi.
Su MSSQL, viene aggiunta una riga GO dopo uno script la cui ultima riga non è GO (o GO seguito da un conteggio), come indica la riga sotto i due campi. Su Oracle, terminare manualmente un blocco PL/SQL con la relativa riga /.
I campi evidenziano la sintassi SQL e si espandono con il testo.
Una modifica viene applicata quando si esce dal campo, facendo clic altrove o cambiando scheda, e solo allora cambiano il codice SQL accanto e il documento. Un campo in cui si è solo fatto clic non cambia nulla.
Una modifica a uno script cambia il diagramma come qualsiasi altra modifica: viene salvata nel file, i collaboratori la vedono e ogni modifica applicata è un passo della cronologia delle modifiche, annullabile dalla scheda ERD.
Durante la digitazione in un campo, i tasti di scelta rapida propri dell’editor vengono lasciati al campo, quindi Ctrl + Z (Windows/Linux) o ⌘ + Z (Mac) annulla il testo digitato nel campo, e copia, taglia e incolla agiscono sul testo anziché sul diagramma.
La Ricerca rapida e la ricerca del pannello Esplora si aprono comunque con i rispettivi tasti di scelta rapida, Ctrl + K e Ctrl + F (Windows/Linux) o ⌘ + K e ⌘ + F (Mac). Poiché Ctrl + F o ⌘ + F passa alla scheda ERD, applica la modifica, come qualsiasi cambio di scheda.
Un campo senza il focus recepisce una modifica che un collaboratore o un agente di programmazione apporta al suo script. Un campo che ha il focus mostra quella modifica quando lo si lascia senza aver digitato nulla. Se si è digitato qualcosa, il proprio testo viene applicato all’uscita dal campo e sostituisce il loro.
Salvare o copiare il codice SQL
Save file, in fondo al pannello o nel menu contestuale, salva esattamente il codice SQL mostrato dalla scheda, con i valori attuali di database, delimitatore, istruzioni, intestazione, tabelle e script, come <database name>-<timestamp>.sql. Il file viene denominato e salvato come ogni altra esportazione — vedere Esportazione.
Export ▸ Schema SQL, nel menu contestuale dell’area di disegno o nella Ricerca rapida, da solo non salva nulla.
Passa a questa scheda, apre il pannello opzioni anche se era compresso e sposta il focus su Save file, quindi premendo Enter si salva il file.
Copy in fondo al pannello, o il pulsante di copia che compare in alto a destra nel codice quando vi si passa sopra il puntatore, copia il codice SQL.
Lo conferma per due secondi la notifica Copied! con un segno di spunta. Se il browser o l’host rifiuta l’accesso agli Appunti, lo segnala invece la notifica Couldn't copy to the clipboard con un simbolo di avviso. Una nuova copia sostituisce la notifica anziché aggiungerne un’altra.
Il codice SQL è anche selezionabile, quindi è possibile prenderne solo una parte.
Cosa scrive il DDL
Queste regole valgono ovunque l’editor scriva lo Schema SQL: in questa scheda e nel relativo file, e nel codice SQL letto da una pagina in cui è incorporato l’editor o da un agente di programmazione.
La scheda Schema SQL di Proprietà tabella le segue per la singola tabella che mostra. Non scrive chiavi esterne, tranne quelle di SQLite, che si trovano all’interno del suo CREATE TABLE, né sequenze o trigger di Oracle.
Le parti compaiono in quest’ordine, separate da una riga vuota: l’intestazione, lo script prima delle tabelle, le istruzioni DROP, le tabelle e lo script dopo le tabelle. Le tabelle vengono scritte in ordine di nome.
Un diagramma senza tabelle e senza script non scrive nulla, anche se è stata scelta un’intestazione.
Incremento automatico
Una colonna contrassegnata come Auto Increment viene scritta nel modo proprio di ciascun database: AUTO_INCREMENT su MySQL e MariaDB, IDENTITY(1,1) su MSSQL, AUTOINCREMENT su Snowflake e GENERATED ALWAYS AS IDENTITY su PostgreSQL e Databricks.
Per Oracle vengono scritti una sequenza SEQ_<table> e un trigger SEQ_TRG_<table> che popola la colonna a partire dalla sequenza. Il trigger termina con una riga /, quindi SQL*Plus e SQLcl lo eseguono.
Dove un database non accetta l’incremento automatico sul tipo della colonna, la clausola viene omessa e una riga di commento dopo la tabella indica la colonna:
- PostgreSQL lo accetta solo su
smallint,integerobigint, con uno qualsiasi dei loro nomi:INT,INTEGER,BIGINT,SMALLINT,INT2,INT4oINT8. Una colonna di un altro tipo non riceve né la clausola né un valore predefinito, e il commento riporta, ad esempio,-- PostgreSQL takes IDENTITY only on smallint, integer or bigint, so member.id is written without it. - Databricks lo accetta solo su
BIGINToLONG. - SQLite accetta
AUTOINCREMENTsolo sull’unica colonna di chiave primaria di una tabella, se di tipo intero, comeINT,BIGINToINT8, con o senza larghezza. Quella colonna viene scritta comeINTEGERe la chiave comePRIMARY KEY (id AUTOINCREMENT). Una chiave singola di qualsiasi altro tipo viene scritta senza di esso.
Azioni referenziali
Le azioni ON DELETE e ON UPDATE scritte da ciascun database sono elencate in ON DELETE e ON UPDATE.
Dove Snowflake omette un’azione, un commento sopra l’istruzione ALTER TABLE di quella chiave esterna la indica, ad esempio -- Snowflake creates no foreign key with a referential action other than NO ACTION, so ON DELETE CASCADE is left out.
Nomi di tabella qualificati con lo schema
Con Bracket impostato su None, un nome di tabella con un punto, come sales.users, viene interpretato come schema e tabella, divisi in corrispondenza dell’ultimo punto al di fuori di parentesi quadre o virgolette doppie.
- MySQL, MariaDB, MSSQL, Oracle e PostgreSQL costruiscono i nomi automatici che scrivono a partire dalla sola parte della tabella:
FK_users_TO_orderseIDX_userssu tutti e cinque,UQ_users_emailsu tutti tranne PostgreSQL, ePK_userssu MSSQL e Oracle, i due tra questi che assegnano un nome alla chiave primaria. Su questi due, anche[sales].[users]e"sales"."users"dannoPK_users, e[Order]dàPK_Order. - SQLite non assegna nomi ai vincoli, quindi l’unico nome automatico che costruisce è quello dell’indice:
CREATE INDEX sales.IDX_users ON users. - Oracle crea gli indici della tabella, e la sequenza e il trigger di una colonna a incremento automatico, nello schema della tabella:
sales.IDX_users,sales.SEQ_usersesales.SEQ_TRG_users. - In Oracle e SQLite, un nome di indice a cui si è assegnato manualmente uno schema lo mantiene.
- Un nome automatico di chiave esterna o di indice che ripete uno precedente, senza distinzione tra maiuscole e minuscole, riceve un numero. Con
sales.usersehr.Usersentrambe referenziate daorders, la seconda chiave èFK_Users_TO_orders1.
Con qualsiasi altro valore di Bracket, l’intero nome della tabella è un unico identificatore, come "PK_sales.users". Snowflake e Databricks mantengono sempre il nome intero.
Le righe Keys della scheda Indici mostrano gli stessi nomi.
Valori predefiniti
Il valore predefinito di una colonna viene scritto così come è stato digitato, ma tra parentesi dove il database legge quell’espressione solo al loro interno. Un valore predefinito già tra parentesi viene lasciato invariato.
- MySQL racchiude tra parentesi tutto tranne un valore letterale o l’ora corrente, come
(uuid()). Racchiude inoltre qualsiasi valore predefinito diverso daNULLsu una colonnaBLOB,TEXT,JSON, spaziale oLONG…, e l’ora corrente su qualsiasi colonna che non siaTIMESTAMPoDATETIME. - MariaDB racchiude tutto tranne un valore letterale, l’ora corrente, una chiamata di funzione o un nome.
- SQLite racchiude tutto tranne un valore letterale o un nome, come
(datetime('now')). - PostgreSQL racchiude solo un’espressione con una parola come
AT TIME ZONE,AND,OR,IS,IN,LIKE,COLLATEo= ANYal di fuori delle parentesi, come(now() AT TIME ZONE 'utc'). - MSSQL, Oracle, Snowflake e Databricks scrivono ogni valore predefinito così come è stato digitato.
Editor di sola lettura
In un editor readonly la scheda funziona come di consueto: Database e Bracket cambiano comunque il codice SQL mostrato, Statements, Header e Tables continuano a funzionare, e Save file e Copy continuano a salvarlo e copiarlo.
Solo i due campi degli script sono di sola lettura.