Database
 sql >> база данни >  >> RDS >> Database

Разлика между вградени и извънредни ограничения

Ограниченията върху таблиците и колоните ви позволяват да наложите качеството на данните. В SQL има два начина за създаване на ограничения върху таблица:вградени иизвън линията .

В тази статия ще проуча тези ограничения и предимствата, които имат, както и ще обясня кое от тях препоръчвам и защо.

Какво е вградено ограничение?

Вградено ограничение е ограничение, което декларирате на същия ред като колоната, когато създавате таблица.

СЪЗДАВАНЕ на служител на ТАБЛИЦА (emp_id NUMBER(10) PRIMARY KEY,first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10));

В този пример думите PRIMARY KEY след колоната emp_id показват, че emp_id е първичният ключ.

По този начин създадохме ограничение за първичен ключ за тази колона, като добавихме ключовите думи. Концепцията е една и съща независимо от типа на ограничението.

Какво е ограничение извън линия?

Ограничение извън линията е ограничението, декларирано на отделен ред за колоната. Добавяме го в края на израза CREATE TABLE.

Например имаме следния скрипт:

СЪЗДАВАНЕ НА ТАБЛИЦА служител (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT pk_emp PRIMARY KEY (emp_id));

Както можете да видите, ние задаваме ограничението PRIMARY KEY, наречено pk_emp , към колоната emp_id в края на изявлението.

Тази концепция работи по същия начин, независимо от типа на ограничението.

Сега нека анализираме разликата между тези два типа ограничения, различни от мястото, където са декларирани.

Извънредните ограничения могат да имат посочени имена

Когато създаваме извънредни ограничения, можем да посочим име. Макар че това може да изглежда загуба на време, може да бъде полезно.

Помислете за това на конкретен пример:

CREATE TABLE служител (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT pk_emp ПРАВИЛЕН КЛЮЧ (emp_id),CONSTRAINT fk_emp_deptid FOREIGN_id KEY (REFEpt_id FOREIGN KEY) ),CONSTRAINT ck_emp_lnlen ПРОВЕРКА (ДЪЛЖИНА(последно_име)> 3));

Зададохме следните имена за няколко ограничения:

  • pk_emp
  • fk_emp_deptid
  • ck_emp_lnlen

Може да изглежда, че това е просто ненужно въвеждане, но не е така. Ще разгледаме това по-отблизо.

И така, защо трябва да присвояваме име на ограничение?

Именуването на ограничения може да бъде полезно в няколко ситуации. Без да посочва името, Oracle автоматично генерира име за ограничението, което прави за всички вградени ограничения. Обикновено това име не предоставя никаква полезна информация.

Когато получите грешки в SQL изрази, PL/SQL код или код на приложение, е добра идея да използвате името на ограничението и да знаете за какво се отнася или поне да направите предположение. Такива имена като pk_emp или ck_emp_lnlen би бил по-описателен от общия EMP1290894FH име.

Също така, когато преглеждате планове за изпълнение, името на ограничението често се използва в изхода, което улеснява изработването на начина, по който се изпълнява планът. Особено, когато имаме случаи, определящи дали се използва първичен или външен ключ.

Ограниченията НЕ NULL могат да бъдат декларирани само вградени

Има само един тип ограничение, което може да бъде декларирано като вградено ограничение. Това е ограничението NOT NULL.

Това означава, че не можете да го декларирате като извън линия.

Изпълнете следния код:

СЪЗДАВАНЕ НА ТАБЛИЦА служител (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200) NOT NULL,dept_id NUMBER(10));

Въпреки това, когато стартираме кода по-долу, можем да видим, че той не работи:

CREATE TABLE служител (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT nn_emp_ln NOT NULL (last_name));

За да обобщим, за ограниченията NOT NULL трябва да ги декларираме вградени.

CHECK Ограниченията могат да се отнасят до множество колони

Ако създадете вградено ограничение CHECK, то може да се отнася само за колоната, в която се създава.

Ако обаче създадете ограничение CHECK като извън линия, то може да се отнася до множество колони.

Създайте служителя таблица с ограничението CHECK, както е показано по-долу:

СЪЗДАВАНЕ на служител на ТАБЛИЦА (emp_id NUMBER(10),first_name VARCHAR2(200) CHECK (LENGTH(first_name)> 10),famly_name VARCHAR2(200),dept_id NUMBER(10));

Това ограничение показва, че first_name трябва да надвишава 10 знака.

Но какво ще стане, ако искаме да уточним, че екомбинацията на собственото и фамилното име трябва да надвишава 10 знака?

За да направите това, напишете отново кода като ограничение извън линия:

CREATE TABLE служител (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)); предварително> 

Виждаме, че това правило може да се приложи само с ограничение извън линията.

Препоръчан метод

След като анализирах и двата метода:вграден или извън линия, препоръчвам да използвате ограниченията извън линията.

Има няколко причини за това.

Първо, можете да посочите име за вашите ограничения и да ги видите в съобщенията за грешки и вътрешните планове за изпълнение. Може също да помогне при деактивирането и разрешаването на ограниченията.

Второ, ограниченията за проверка ви позволяват да се позовавате на множество и единични колони. По този начин е по-гъвкаво, ако ги добавите като ограничение извън линията.

И накрая, като всички ограничения са декларирани като извън реда (освен NOT NULL, което може да бъде дефинирано само като вградено ограничение) улеснява разглеждането на вашия синтаксис CREATE TABLE и виждането на всичките си ограничения на едно място. Това е важно особено в случаите, когато има големи таблици с много ограничения.

В заключение, можете да създавате ограничения, като използвате два различни метода:вграден и извън линия. Препоръчвам да използвате метода извън линия, където можете, защото има по-голяма гъвкавост и задаване на име на ограниченията, като по този начин опростявате анализа на вашите планове за изпълнение и друга SQL информация.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pandas:Как да чета и записвам файлове

  2. Как да премахнете дубликатите в SQL

  3. Оттеглени функции, които да извадите от кутията си с инструменти – част 3

  4. Работа с JDBC данни в Domo

  5. Как да получите деня от дата в T-SQL