sql >> Databasteknik >  >> RDS >> Database

Skillnaden mellan inline och out-of-line begränsningar

Begränsningar på tabeller och kolumner gör att du kan upprätthålla datakvaliteten. I SQL finns det två sätt att skapa begränsningar på en tabell:inline och utanför .

I den här artikeln ska jag utforska dessa begränsningar och fördelarna de har, samt förklara vilken jag rekommenderar och varför.

Vad är en inline-begränsning?

En inline-begränsning är en begränsning som du deklarerar på samma rad som kolumnen när du skapar en tabell.

CREATE TABLE-anställd (emp_id NUMBER(10) PRIMARY KEY,first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10));

I det här exemplet indikerar orden PRIMARY KEY efter kolumnen emp_id att emp_id är primärnyckeln.

Därför har vi skapat en primär nyckelrestriktion för den här kolumnen genom att lägga till nyckelorden. Konceptet är detsamma oavsett typ av begränsning.

Vad är en out-of-line-begränsning?

En out-of-line-begränsning är den begränsning som deklareras på en separat rad för kolumnen. Vi lägger till det i slutet av CREATE TABLE-satsen.

Till exempel har vi följande skript:

CREATE TABLE anställd (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10), CONSTRAINT pk_emp PRIMÄRNYCKEL (emp_id));

Som du kan se ställer vi in ​​PRIMARY KEY-begränsningen, kallad pk_emp , till emp_id-kolumnen i slutet av uttalandet.

Detta koncept fungerar på samma sätt oavsett typ av begränsning.

Låt oss nu analysera skillnaden mellan dessa två typer av begränsningar, andra än var de deklareras.

Out-of-line-begränsningar kan ha namn specificerade

När vi skapar out-of-line begränsningar kan vi ange ett namn. Även om det här kan verka slöseri med tid, kan det vara till hjälp.

Tänk på detta i ett särskilt exempel:

CREATE TABLE-anställd (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) department (rEFERENCID) ),CONSTRAINT ck_emp_lnlen CHECK (LENGTH(last_name)> 3));

Vi har angett följande namn för några begränsningar:

  • pk_emp
  • fk_emp_deptid
  • ck_emp_lnlen

Det kan tyckas att det bara är onödigt att skriva, men det är det inte. Vi ska titta närmare på detta.

Så varför behöver vi tilldela ett namn till en begränsning?

Att ha namngivna begränsningar kan vara till hjälp i flera situationer. Utan att ange namnet genererar Oracle automatiskt ett namn för begränsningen som det gör för alla inline-begränsningar. Vanligtvis ger det här namnet ingen användbar information.

När du får fel i SQL-satser, PL/SQL-kod eller applikationskod är det en bra idé att använda begränsningsnamnet och veta vad det refererar till eller åtminstone göra en gissning. Sådana namn som pk_emp eller ck_emp_lnlen skulle vara mer beskrivande än den generiska EMP1290894FH namn.

Vid granskning av genomförandeplaner används också regelnamnet ofta i utdata, vilket gör det lättare att räkna ut hur planen utförs. Speciellt när vi har fall som avgör om primärnyckel eller främmande nyckel används.

INTE NULL-begränsningar kan endast deklareras inline

Det finns bara en begränsningstyp som kan deklareras som en inline-begränsning. Detta är NOT NULL-begränsningen.

Det betyder att du inte kan deklarera det som outline.

Kör följande kod:

CREATE TABLE-anställd (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200) NOT NULL,dept_id NUMBER(10));

Men när vi kör koden nedan kan vi se att den inte fungerar:

CREATE TABLE-anställd (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT nn_emp_ln NOT NULL (last_name));

För att sammanfatta det, för NOT NULL-begränsningarna måste vi deklarera dem inline.

Kontrollera begränsningar kan hänvisa till flera kolumner

Om du skapar en CHECK inline-begränsning kan den bara referera till kolumnen som den skapas på.

Men om du skapar en CHECK-begränsning som out of line, kan den referera till flera kolumner.

Skapa anställd tabell med CHECK-begränsningen som visas nedan:

CREATE TABLE-anställd (emp_id NUMBER(10),first_name VARCHAR2(200) CHECK (LENGTH(first_name)> 10),last_name VARCHAR2(200),dept_id NUMBER(10));

Denna begränsning visar att förnamn måste vara längre än 10 tecken.

Men tänk om vi ville ange att kombinationen förnamn och efternamn måste överstiga 10 tecken?

För att göra detta, skriv om koden som en out-of-line-begränsning:

CREATE TABLE-anställd (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)); 

Vi kan se att denna regel endast kan implementeras med en out-of-line-begränsning.

Rekommenderad metod

Efter att ha analyserat båda metoderna:inline eller out of line, rekommenderar jag att du använder out-of-line-begränsningarna.

Det finns några anledningar till detta.

Först kan du ange ett namn för dina begränsningar och se dem i felmeddelanden och interna exekveringsplaner. Det kan också hjälpa till med att inaktivera och aktivera begränsningar.

För det andra tillåter kontrollbegränsningar dig att referera till flera och enstaka kolumner. Därför är det mer flexibelt om du lägger till dem som en out-of-line begränsning.

Slutligen, att ha alla begränsningar deklarerade som outline (förutom NOT NULL som bara kan definieras som en inline-begränsning) gör det lättare att titta på din CREATE TABLE-syntax och se alla dina begränsningar på ett ställe. Det är viktigt särskilt i de fall där det finns stora bord med många begränsningar.

Sammanfattningsvis kan du skapa begränsningar med två olika metoder:inline och out of line. Jag rekommenderar att du använder out-of-line-metoden där du kan, eftersom det finns mer flexibilitet, och att sätta ett namn på begränsningarna, vilket förenklar analysen av dina exekveringsplaner och annan SQL-information.


  1. MySQL - Hur summerar man tider?

  2. MySQL-datumformat – vad du behöver veta

  3. CURRENT_TIMESTAMP Exempel – MySQL

  4. Sätt tomma strängar ('') till NULL i hela databasen