sql >> Databáze >  >> RDS >> Database

Rozdíl mezi omezeními Inline a Out-of-Line

Omezení tabulek a sloupců umožňují vynutit kvalitu dat. V SQL existují dva způsoby vytváření omezení v tabulce:inline a mimo řád .

V tomto článku prozkoumám tato omezení a výhody, které mají, a také vysvětlím, které z nich doporučuji a proč.

Co je to vložené omezení?

Inline omezení je omezení, které deklarujete na stejném řádku jako sloupec při vytváření tabulky.

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

V tomto příkladu slova PRIMARY KEY za sloupcem emp_id označují, že emp_id je primární klíč.

Proto jsme pro tento sloupec vytvořili omezení primárního klíče přidáním klíčových slov. Koncept je stejný bez ohledu na typ omezení.

Co je to omezení mimo linii?

Omezení mimo čáru je omezení deklarované na samostatném řádku pro sloupec. Přidáme jej na konec příkazu CREATE TABLE.

Máme například následující skript:

CREATE TABLE zaměstnanec (emp_id NUMBER(10),křestní_jméno VARCHAR2(200),příjmení VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT pk_emp PRIMARY KEY (emp_id));

Jak vidíte, nastavili jsme omezení PRIMARY KEY nazvané pk_emp , do sloupce emp_id na konci příkazu.

Tento koncept funguje stejným způsobem bez ohledu na typ omezení.

Nyní pojďme analyzovat rozdíl mezi těmito dvěma typy omezení, kromě toho, kde jsou deklarovány.

Omezení mimo řádek mohou mít zadaná jména

Při vytváření mimořádkových omezení můžeme zadat název. I když se to může zdát jako ztráta času, může to být užitečné.

Zvažte to na konkrétním příkladu:

CREATE TABLE zaměstnanec (emp_id NUMBER(10),křestní_jméno VARCHAR2(200),příjmení VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT pk_emp PRIMARY KEY (emp_id),CONSTRAINT fk_emp_deptid FOREIGN KEY (dept_id KEY) REFERENCE ),CONSTRAINT ck_emp_lnlen CHECK (DÉLKA(příjmení)> 3));

Zadali jsme následující názvy pro několik omezení:

  • pk_emp
  • fk_emp_deptid
  • ck_emp_lnlen

Mohlo by se zdát, že je to jen zbytečné psaní, ale není tomu tak. Na to se podíváme blíže.

Proč tedy musíme omezení přiřadit název?

Pojmenování omezení může být užitečné v několika situacích. Bez zadání názvu Oracle automaticky vygeneruje název pro omezení, který dělá pro všechna vložená omezení. Tento název obvykle neposkytuje žádné užitečné informace.

Když se objeví chyby v příkazech SQL, kódu PL/SQL nebo kódu aplikace, je dobré použít název omezení a vědět, na co odkazuje, nebo to alespoň odhadnout. Názvy jako pk_emp nebo ck_emp_lnlen by bylo popisnější než obecný EMP1290894FH jméno.

Při kontrole prováděcích plánů se ve výstupu často používá název omezení, což usnadňuje zjištění, jak se plán provádí. Zvláště, když máme případy určující, zda se používá primární klíč nebo cizí klíč.

Omezení NENÍ NULL lze deklarovat pouze jako vložené

Existuje pouze jeden typ omezení, který lze deklarovat jako vložené omezení. Toto je omezení NOT NULL.

To znamená, že ji nemůžete prohlásit za mimořádnou.

Spusťte následující kód:

CREATE TABLE zaměstnanec (emp_id NUMBER(10),křestní_jméno VARCHAR2(200),příjmení VARCHAR2(200) NOT NULL,dept_id NUMBER(10));

Při spuštění níže uvedeného kódu však vidíme, že nefunguje:

CREATE TABLE zaměstnanec (emp_id NUMBER(10),křestní_jméno VARCHAR2(200),příjmení VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT nn_emp_ln NOT NULL (last_name));

Abych to shrnul, pro omezení NOT NULL je musíme deklarovat jako inline.

ZKONTROLUJTE, že omezení mohou odkazovat na více sloupců

Pokud vytvoříte vložené omezení CHECK, může odkazovat pouze na sloupec, na kterém se vytváří.

Pokud však vytvoříte podmínku CHECK jako mimořádnou, může odkazovat na více sloupců.

Vytvořte zaměstnance tabulka s omezením CHECK, jak je uvedeno níže:

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

Toto omezení ukazuje, že jméno musí být delší než 10 znaků.

Co kdybychom však chtěli specifikovat, že kombinace jméno a příjmení musí být delší než 10 znaků?

Chcete-li to provést, přepište kód jako omezení mimo řádek:

CREATE TABLE zaměstnanec (emp_id NUMBER(10),křestní_jméno VARCHAR2(200),,příjmení VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT ck_fullname_len CHECK (LENGTH(křestní_jméno || příjmení)> 10)); před> 

Vidíme, že toto pravidlo lze implementovat pouze s omezením mimo čáru.

Doporučená metoda

Po analýze obou metod:inline nebo out of line, doporučuji použít out-of-line omezení.

Existuje pro to několik důvodů.

Nejprve můžete zadat název svých omezení a zobrazit je v chybových zprávách a interních plánech provádění. Může také pomoci s deaktivací a povolením omezení.

Za druhé, kontrolní omezení vám umožňují odkazovat na více a jeden sloupec. Je tedy flexibilnější, když je přidáte jako omezení mimo čáru.

A konečně, když budou všechna omezení deklarována jako mimořádná (kromě NOT NULL, které lze definovat pouze jako vložené omezení), bude snazší podívat se na syntaxi CREATE TABLE a zobrazit všechna svá omezení na jednom místě. Je to důležité zejména v případech, kdy existují velké tabulky s mnoha omezeními.

Závěrem lze říci, že můžete vytvořit omezení pomocí dvou různých metod:inline a out of line. Doporučuji použít metodu out-of-line, kde je to možné, protože je zde větší flexibilita, a nastavit název omezení, čímž se zjednoduší analýza vašich plánů provádění a dalších informací SQL.


  1. Funkce řetězce SQL Server (úplný seznam)

  2. Světový den zálohování:4 zajímavá fakta o ztrátě dat, která byste měli vědět

  3. Jak mohu použít UUID v SQLAlchemy?

  4. Jak získat ID posledního aktualizovaného řádku v MySQL?