Database
 sql >> Database >  >> RDS >> Database

Differenza tra vincoli in linea e fuori linea

I vincoli su tabelle e colonne consentono di imporre la qualità dei dati. In SQL, ci sono due modi per creare vincoli su una tabella:inline e fuori linea .

In questo articolo esplorerò questi vincoli e i vantaggi che hanno, oltre a spiegare quale consiglio e perché.

Cos'è un vincolo in linea?

Un vincolo inline è un vincolo che dichiari sulla stessa riga della colonna durante la creazione di una tabella.

CREATE TABLE employee (
emp_id NUMBER(10) PRIMARY KEY,
first_name VARCHAR2(200),
last_name VARCHAR2(200),
dept_id NUMBER(10)
);

In questo esempio, le parole CHIAVE PRIMARIA dopo la colonna emp_id indicano che emp_id è la chiave primaria.

Pertanto, abbiamo creato un vincolo di chiave primaria su questa colonna aggiungendo le parole chiave. Il concetto è lo stesso indipendentemente dal tipo di vincolo.

Cos'è un vincolo fuori linea?

Un vincolo fuori riga è il vincolo dichiarato su una riga separata per la colonna. Lo aggiungiamo alla fine dell'istruzione CREATE TABLE.

Ad esempio, abbiamo il seguente script:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),
last_name VARCHAR2(200),
dept_id NUMBER(10),
CONSTRAINT pk_emp PRIMARY KEY (emp_id)
);

Come puoi vedere, impostiamo il vincolo PRIMARY KEY, chiamato pk_emp , nella colonna emp_id alla fine dell'istruzione.

Questo concetto funziona allo stesso modo indipendentemente dal tipo di vincolo.

Ora, analizziamo la differenza tra questi due tipi di vincoli, diversi da dove sono dichiarati.

I vincoli fuori linea possono avere nomi specificati

Quando si creano vincoli fuori linea, è possibile specificare un nome. Anche se può sembrare una perdita di tempo, può essere utile.

Considera questo su un esempio particolare:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),
last_name VARCHAR2(200),
dept_id NUMBER(10),
CONSTRAINT pk_emp PRIMARY KEY (emp_id),
CONSTRAINT fk_emp_deptid FOREIGN KEY (dept_id) REFERENCES department (dept_id),
CONSTRAINT ck_emp_lnlen CHECK (LENGTH(last_name) > 3)
);

Abbiamo specificato i seguenti nomi per alcuni vincoli:

  • pk_emp
  • fk_emp_deptid
  • ck_emp_lnlen

Potrebbe sembrare che sia solo una digitazione non necessaria, tuttavia non lo è. Daremo un'occhiata più da vicino a questo.

Allora, perché dobbiamo assegnare un nome a un vincolo?

Avere vincoli con nome può essere utile in diverse situazioni. Senza specificare il nome, Oracle genera automaticamente un nome per il vincolo che fa per tutti i vincoli inline. Di solito, questo nome non fornisce alcuna informazione utile.

Quando si ottengono errori nelle istruzioni SQL, nel codice PL/SQL o nel codice dell'applicazione, è una buona idea utilizzare il nome del vincolo e sapere a cosa si riferisce o almeno fare un'ipotesi. Nomi come pk_emp o ck_emp_lnlen sarebbe più descrittivo del generico EMP1290894FH nome.

Inoltre, durante la revisione dei piani di esecuzione, il nome del vincolo viene spesso utilizzato nell'output, il che semplifica l'elaborazione del modo in cui viene eseguito il piano. Soprattutto, quando abbiamo casi che determinano se viene utilizzata la chiave primaria o la chiave esterna.

I vincoli NOT NULL possono essere dichiarati solo in linea

Esiste un solo tipo di vincolo che può essere dichiarato come vincolo inline. Questo è il vincolo NOT NULL.

Ciò significa che non puoi dichiararlo come fuori linea.

Esegui il seguente codice:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),
last_name VARCHAR2(200) NOT NULL,
dept_id NUMBER(10)
);

Tuttavia, durante l'esecuzione del codice seguente, possiamo vedere che non funziona:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),
last_name VARCHAR2(200),
dept_id NUMBER(10),
CONSTRAINT nn_emp_ln NOT NULL (last_name)
);

Per riassumere, per i vincoli NOT NULL, dobbiamo dichiararli inline.

CONTROLLA I vincoli possono fare riferimento a più colonne

Se crei un vincolo in linea CHECK, può fare riferimento solo alla colonna su cui viene creato.

Tuttavia, se crei un vincolo CHECK come fuori riga, può fare riferimento a più colonne.

Crea il dipendente tabella con il vincolo CHECK come mostrato di seguito:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200) CHECK (LENGTH(first_name) > 10),
last_name VARCHAR2(200),
dept_id NUMBER(10)
);

Questo vincolo mostra che il nome deve superare i 10 caratteri.

Tuttavia, se volessimo specificare che la combinazione di nome e cognome devono superare i 10 caratteri?

Per fare ciò, riscrivi il codice come vincolo fuori linea:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),,
last_name VARCHAR2(200),
dept_id NUMBER(10),
CONSTRAINT ck_fullname_len CHECK (LENGTH(first_name || last_name) > 10)
);

Possiamo vedere che questa regola può essere implementata solo con un vincolo fuori linea.

Metodo consigliato

Dopo aver analizzato entrambi i metodi:in linea o fuori linea, consiglio di utilizzare i vincoli fuori linea.

Ci sono alcune ragioni per questo.

Innanzitutto, puoi specificare un nome per i tuoi vincoli e visualizzarli nei messaggi di errore e nei piani di esecuzione interni. Può anche aiutare a disabilitare e abilitare i vincoli.

In secondo luogo, i vincoli di controllo consentono di fare riferimento a colonne multiple e singole. Pertanto, è più flessibile se li aggiungi come vincolo fuori linea.

Infine, avere tutti i vincoli dichiarati come fuori linea (tranne NOT NULL che può essere definito solo come un vincolo inline) rende più facile esaminare la sintassi CREATE TABLE e vedere tutti i vincoli in un unico posto. È importante soprattutto nei casi in cui ci sono tabelle di grandi dimensioni con molti vincoli.

In conclusione, puoi creare vincoli utilizzando due metodi diversi:in linea e fuori linea. Ti consiglio di utilizzare il metodo fuori linea dove puoi, perché c'è più flessibilità, e di dare un nome ai vincoli, semplificando così l'analisi dei tuoi piani di esecuzione e altre informazioni SQL.