Unique SQL приклади. SQL UNIQUE обмеження. Переконайтеся, що значення - унікальні

Обмеження UNIQUEв SQLдозволяє ідентифікувати кожен запис у таблиці.

Якщо міститься обмеження стовпця UNIQUEу полі при створенні таблиці, база даних відхиляє будь-яку спробу введення в це поле для одного з рядків, значення, яке вже представлене в іншому рядку. Це обмеження може застосовуватися тільки до полів, які були оголошені як непусті ( NOT NULL), оскільки немає сенсу дозволити одному рядку таблиці мати значення NULL, а потім виключати інші рядки з NULLзначеннями як дублікати.

SQL Server / Oracle / Access

Приклад створення таблиці SQLз обмеженням UNIQUE:

CREATE TABLE Student

(Kod_stud integer NOT NULL UNIQUE,

Fam char (30) NOT NULL UNIQUE,

Adres char (50),

Коли оголошується поле Fam унікальним, дві Смирнові Марії можуть бути введені у різний спосіб- наприклад, Смирнова Марія та Смирнова М. Стовпці (не первинні ключі), чиї значення вимагають унікальності, називаються ключами-кандидатами або унікальними ключами. Можна визначити групу полів як унікальну за допомогою команди обмеження таблиці. UNIQUE. Оголошення групи полів унікальної, відрізняється від оголошення унікальними індивідуальних полів, оскільки це комбінація значень, а чи не просто індивідуальне значення, що має бути унікальним. Унікальність групи полягає в тому, що кілька рядків зі значеннями стовпців «a», «b» і «b», «a» розглядалися окремо один від одного.

Якщо база даних визначає, що кожна спеціальність належить одному і лише одному факультету, то кожна комбінація коду факультету (Kod_f) та коду спеціальності (Kod_spec) у таблиці Spec має бути унікальною. Наприклад:

CREATE TABLE Spec
(Kod_spec integer NOT NULL,
Kod_f integer NOT NULL,
Nazv_spec char (50) NOT NULL,
UNIQUE(Kod_spec, Kod_f));

Обидва поля в обмеженні таблиці UNIQUE все ще використовують обмеження стовпця - NOT NULL. Якби використовувалося обмеженнястовпця UNIQUEдля поля Kod_spec, таке обмеженнятаблиці було б необов'язковим. Якщо значення поля Kod_spec є різним для кожного рядка, то не може бути двох рядків з ідентичною комбінацією значень полів Kod_spec і Kod_f. Обмеженнятаблиці UNIQUEнайбільш корисно, коли індивідуальні поля не обов'язково мають бути унікальними.

MySQL UNIQUE

Приклад створення таблиці Persons у MySQLз обмеженням UNIQUE:

CREATE TABLE Persons (
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE(P_Id)
);

Видалити обмеження UNIQUE

Якщо після створення обмеження UNIQUEі в тому випадку, коли обмеження UNIQUEне має сенсу, UNIQUEможна видалити. Для цього використовуйте наступний SQL:

SQL Server / Oracle / MS Access:

ALTER TABLE table_name DROP CONSTRAINT uc_PersonID;

ALTER TABLE table_name DROP INDEX uc_PersonID;

У РОЗДІЛІ 17 , Ви дізналися як створюються таблиці. Тепер більш ретельно з цього місця ми покажемо вам, як ви можете встановлювати обмеження в таблицях. Обмеження - це частина визначень таблиці, яка обмежує значення, які ви можете вводити в стовпці. До цього місця в книзі, єдиним обмеженням на значення які ви могли вводити, були тип даних і розмір значень, що вводяться, які повинні бути сумісні з тими стовпцями в які ці значення поміщаються (як і визначено в команді CREATE TABLE або команді ALTER TABLE). Обмеження дають вам значно більші можливості, і скоро ви це побачите. Ви також дізнаєтесь як визначати значення за промовчанням у цьому розділі. За замовчуванням - це значення, яке вставляється автоматично в будь-який стовпець таблиці, коли значення для цього стовпця відсутнє в команді INSERT для цієї таблиці. NULL - це значення, що найбільш широко використовується за замовчуванням, але в цьому розділі буде показано як визначати й інші значення за замовчуванням.

ОБМЕЖЕННЯ ТАБЛИЦЬ

Коли ви створюєте таблицю (або, коли ви її змінюєте), ви можете поміщати обмеження на значення, які можуть бути введені в підлогу. Якщо ви це зробили, SQL буде відхиляти будь-які значення, які порушують критерії, які ви визначили. Є два основних типи обмежень - обмеження стовпця та обмеження таблиці. Різниця між ними в тому, що обмеження стовпця застосовується тільки до індивідуальних стовпців, тоді як обмеження таблиці застосовується до груп з одного і більше стовпців.

ОГОЛОШЕННЯ ОБМЕЖЕНЬ

Ви вставляєте обмеження шпальти в кінець імені шпальти після типу даних і перед комою. Обмеження таблиці поміщаються в кінець імені таблиці після останнього імені стовпця, але перед заключною круглою дужкою. Далі показано синтаксис для команди CREATE TABLE, розширеної для включення до неї обмежень: CREATE TABLE< table name > (< column name > < column constraint >, < column name > < data type > < column constraint > ... < table constraint > (< column name > [, < column name >])...); (Для стислості, ми опустили аргумент розміру, який іноді використовується з типом даних.) Підлога даних у круглих дужках після обмеження таблиці - це підлога до яких застосовано це обмеження. Обмеження стовпця, природно, застосовується до стовпців, після імен яких воно слідує. Решта цього розділу описуватиме різні типиобмежень та їх використання.

ВИКОРИСТАННЯ ОБМЕЖЕНЬ ДЛЯ ВИКЛЮЧЕННЯ ПОРОЖНИХ(NULL) ПОКАЗАЧІВ

Ви можете використовувати команду CREATE TABLE, щоб захистити поле від дозволу в ньому порожніх (NULL) покажчиків за допомогою обмеження NOT NULL. Це обмеження накладається лише різноманітних стовпців.

Ви можете згадати, що NULL - це спеціальне позначення, яке відзначає поле як порожнє. NULL може бути корисним, коли є випадки, коли ви хочете бути від них гарантовано. Очевидно, що первинні ключі ніколи не повинні бути порожніми, оскільки це підриватиме їх функціональні можливості. Крім того, такі стать як імена, вимагають у більшості випадків, певних значень. Наприклад, ви напевно захочете мати ім'я для кожного замовника в таблиці Замовників. Якщо ви помістите ключові слова NOT NULL відразу після типу даних (включаючи розмір) стовпця, будь-яка спроба помістити значення NULL у цьому полі буде відхилена. Інакше SQL розуміє, що NULL дозволено.

Наприклад, давайте покращимо наше визначення таблиці Продавців, не дозволяючи поміщати NULL значення в стовпці snum або sname: CREATE TABLE Salespeople (Snum integer NOT, Sname char(10) NOT, city char(10), comm decimal); Важливо пам'ятати, що будь-якому стовпцю з обмеженням NOT NULL має бути встановлене значення в кожній пропозиції INSERT, що впливає на таблицю. За відсутності NULL SQL може не мати значень для встановлення в ці стовпці, якщо звичайно значення за замовчуванням, описане раніше в цьому розділі, вже не було призначено.

Якщо ваша система підтримує використання ALTER TABLE, щоб додавати нові стовпці до вже існуючої таблиці, ви можете ймовірно поміщати обмеження стовпців типу NOT NULL для цих нових стовпців. Однак, якщо ви наказуєте новому стовпцю значення NOT NULL, поточна таблиця повинна бути порожньою.

ПЕРЕКОНАЙТЕСЯ ЩО ЗНАЧЕННЯ - УНІКАЛЬНІ

У розділі 17 ми обговорили використання унікальних індексів, щоб змусити підлогу мати різні значення для кожного рядка. Ця практика залишилася з колишніх часів, коли SQL підтримував обмеження UNIQUE. Унікальність - це властивість даних у таблиці, і тому його логічніше назвати як обмеження цих даних, а не просто як властивість логічної відмінності, що зв'язує об'єкт даних (індекс).

Безперечно, унікальні індекси - один із найпростіших і найефективніших методів розпорядження унікальності. З цієї причини деякі реалізації обмеження UNIQUE використовують унікальні індекси; тобто вони створюють індекс не повідомляючи вам про це. Залишається фактом, що ймовірність безладу в базі даних досить мала, якщо ви наказуєте унікальність разом з обмеженням.

УНІКАЛЬНІСТЬ ЯК ОБМЕЖЕННЯ СТОЛБЦЯ

Час від часу ви хочете переконатися, що всі значення, введені в стовпець, відрізняються один від одного. Наприклад, первинні ключі досить зрозуміло це показують. Якщо ви поміщаєте обмеження стовпця UNIQUE у полі при створенні таблиці, база даних відхиляє будь-яку спробу введення в це поле для одного з рядків, значення, яке вже представлене в іншому рядку. Це обмеження може застосовуватися тільки до полів, які були оголошені як непусті (NOT NULL), тому що не має сенсу дозволити одному рядку таблиці мати значення NULL, а потім виключати інші рядки з значеннями NULL як дублікати. Є подальше вдосконалення нашої команди створення таблиці Продавців: CREATE TABLE Salespeople (Snum integer NOT NULL UNIQUE, Sname char (10) NOT NULL UNIQUE, city char (10), comm decimal);

Коли ви оголошуєте поле sname унікальним, переконайтеся, що дві Mary Smith будуть введені у різний спосіб - наприклад, Mary Smith і M. Smith. У той же час це не так вже й необхідно з функціональної точки зору - тому що поле snum як первинний ключ, все одно забезпечить відмінність цих двох рядків - що простіше для людей, що використовують дані в таблицях, ніж пам'ятати що ці Smith не ідентичні. Стовпці (не первинні ключі), чиї значення вимагають унікальності, називаються ключами-кандидатами або унікальними ключами.

Ви також можете визначити групу полів як унікальну за допомогою команди обмеження таблиці - UNIQUE. Оголошення групи полів унікальної, відрізняється від оголошення унікальними індивідуальних полів, оскільки це комбінація значень, а чи не просто індивідуальне значення, що має бути унікальним. Унікальність групи - це уявлення порядку, так що пари рядків зі значеннями стовпців "a", "b" і "b", "a" розглядалися окремо одна від одної. Наша база даних зроблена так, щоб кожен замовник був призначений одному і тільки одному продавцю. Це означає, що кожна комбінація номера замовника (cnum) та номера продавця (snum) у таблиці Замовників має бути унікальною. Ви можете переконатися в цьому, створивши таблицю Замовників у такий спосіб: CREATE TABLE Customers (cnum integer NOT NULL, name char (10) NOT NULL, city char (10), rating integer, snum integer NOT NULL, UNIQUE (cnum, snum )); Зверніть увагу, що обидва підлоги в обмеженні таблиці UNIQUE все ще використовують обмеження стовпця - NOT NULL. Якби ми використовували обмеження стовпця UNIQUE для підлоги cnum, таке обмеження таблиці було б необов'язковим. Якщо значення підлога cnum різна для кожного рядка, то не може бути двох рядків з ідентичною комбінацією значень полів cnum та snum. Те саме вийде якщо ми оголосимо поле snum унікальним, хоча це і не буде відповідати нашому прикладу, оскільки продавця буде призначено численним замовникам. Отже, обмеження таблиці - UNIQUE, найбільш корисно, коли ви не хочете змушувати індивідуальні підлогу бути унікальними.

Припустимо, наприклад, що ми розробили таблицю щоб стежити за всіма порядками щодня для кожного продавця. Кожен рядок такої таблиці становить суму чисел будь-яких порядків, а не просто індивідуальний порядок. У цьому випадку ми могли б усунути деякі можливі помилкипереконавшись, що на кожен день є не більше одного рядка для даного продавця, або що кожна комбінація полів snum і odate є унікальною. Ось як наприклад ми могли б створити таблицю з ім'ям Salestotal: CREATE TABLE Salestotal (cnum integer NOT NULL, odate date NULL, totamt decimal, UNIQUE (snum, odate)); Крім того, є команда, яку ви будете використовувати, щоб поміщати поточні дані в цю таблицю: INSERT INTO Salestotal

ОБМЕЖЕННЯ ПЕРВИННИХ КЛЮЧІВ

До цього ми сприймали первинні ключі лише як логічні поняття. Хоча ми знаємо що таке первинний ключ, і як він повинен використовуватися в будь-якій таблиці, ми не знаємо "знає" про це SQL. Тому ми використовували обмеження UNIQUE або унікальні індекси у первинних ключах, щоб наказувати їм унікальність. У попередніх версіях мови SQL , це було необхідно, і могло виконуватися цим способом. Однак тепер SQL підтримує первинні ключі безпосередньо з обмеженням Первинний Ключ (PRIMARE KEY). Це обмеження може бути доступним або недоступним вашій системі.

PRIMARY KEY може обмежувати таблиці чи їх стовпці. Це обмеження працює так само як і обмеження UNIQUE, за винятком, коли тільки один первинний ключ (для будь-якої кількості стовпців) може бути визначений для даної таблиці. Існує також різниця між первинними ключами і унікальністю стовпців у способі їх використовуватися із зовнішніми ключами, про які буде розказано в Розділі 19 . Синтаксис та визначення їх унікальності ті ж, що й для обмеження UNIQUE.

Первинні ключі не можуть дозволити значення NULL. Це означає, що подібно полям в обмеженні UNIQUE, будь-яке поле, що використовується в обмеженні PRIMARY KEY, має вже бути оголошено NOT NULL . Є покращений варіант створення нашої таблиці Продавців: CREATE TABLE Salestotal (snum integer NOT NULL PRIMARY KEY, sname char(10) NOT NULL UNIQUE, city char(10), comm decimal); Як ви бачите, унікальність (UNIQUE) полів може бути оголошена для тієї ж таблиці. Найкраще поміщати обмеження PRIMARY KEY в полі (або в поля) яке утворюватиме ваш унікальний ідентифікатор рядка, і зберегти обмеження UNIQUE для полів, які повинні бути унікальними логічно (такі як номери телефону або поле sname), а не для ідентифікації рядків.

ПЕРВИННІ КЛЮЧІ БІЛЬШ НІЖ ОДНОГО ПОЛЯ

Обмеження PRIMARY KEY може бути застосоване для численних полів, що становлять унікальну комбінацію значень. Припустимо, що ваш первинний ключ - це їм, і ви маєте перше їм і останнє їм збереженими у двох різних полях (так що ви можете організовувати дані за допомогою будь-якого з них). Очевидно, що ні перше, ні останнє їм не можна змусити бути унікальним самостійно, але ми можемо кожну з цих двох комбінацій зробити унікальною.

Ми можемо застосувати обмеження таблиці PRIMARY KEY для пар: CREATE TABLE Namefield (firstname char (10) NOT NULL, lastname char (10) NOT NULL city char (10), PRIMARY KEY (firstname, lastname)); Одна проблема в цьому підході є те, що ми можемо змусити появу унікальності - наприклад, ввівши Mary Smith і M. Smith. Це може ввести в оману, тому що ваші службовці можуть не знати, хто з них хто. Зазвичай більш надійний спосіб визначати числове поле, яке могло б відрізняти один рядок від іншого, це мати первинний ключ, і застосовувати обмеження UNIQUE для двох імен полів.

ПЕРЕВІРКА ЗНАЧЕНЬ ПОЛІВ

Розгляньмо ще раз таблицю Продавців. Стовпець комісійних виражається десятковим числом і тому може бути помножений безпосередньо на суму придбань внаслідок чого буде отримано суму комісійних (у доларах) продавця з встановленим праворуч значком долара ($). Хтось може використати поняття відсотка, однак, можна про це й не знати. Якщо людина введе помилково 14 замість.14 щоб вказати у відсотках свої комісійні, це буде розцінено як 14.0, що є законним десятковим значенням, і буде нормально сприйнято системою. Щоб запобігти цій помилці, ми можемо накласти обмеження стовпця - CHECK щоб переконатися, що значення, що вводиться менше ніж 1. CREATE TABLE Salespeople (snum integer (comm< 1));

ВИКОРИСТАННЯ - CHECK, ЩОБ ПОПЕРЕДЖУВАТИ ДОПУСТИМО ВВЕДЕНЕ ЗНАЧЕННЯ

Ми також можемо використовувати обмеження CHECK щоб захистити від введення в поле певних значень, і таким чином запобігти помилці. Наприклад, припустимо, що єдиними містами в яких ми мали відомства збуту, є Лондон, Барселона, Сан Хосе, і Нью Йорк. Якщо вам відомі всі продавці, які працюють у кожному з цих відомств, немає необхідності дозволяти введення інших значень. Якщо ж ні, використання обмеження може запобігти помилкам та іншим помилкам.< 1)); Конечно, если вы собираетесь сделать это, вы должны быть уверены что ваша компания не открыла уже новых других ведомств сбыта. Большинство программ баз данных поддерживают команду ALTER TABLE(см. Главу 17) которая позволяет вам изменять определение таблицы, даже когда она находится в использовании. Однако, изменение или удаление ограничений не всегда возможно для этих команд, даже там где это вроде бы поддерживается. Если вы использовали систему которая не может удалять ограничения, вы будете должны создавать (CREATE) новую таблицу и передавать информацию из старой таблицы в нее всякий раз, когда вы хотите изменить ограничение. Конечно же Вы не захотите делать это часто, и со временем вообще перестанете это делать.

CREATE TABLE Salespeople (snum integer NOT NULL UNIQUE, sname char(10) NOT NULL UNIQUE, city char(10) CHECK, (city IN ("London", "New York", "San Jose", "Barselona")), comm decimal CHECK (comm Створимо таблицю Порядків: CREATE TABLE Orders (onum integer NOT NULL UNIQUE, amt decimal, odate date NOT NULL, cnum integer NOT NULL, snum integer NOT NULL); Як ми вже говорили у Розділі 2, тип DATЕ(ДАТА) широко підтримується, але не є частиною стандарту ANSI. Що ж робити, якщо ми використовуємо базу даних, яка слідує за ANSI, не розпізнає тип DATЕ? Якщо ми оголосимо поле odate будь-яким типом числа, ми не зможемо використовувати похилу межу вправо (/) або рису (-) як розділи. Оскільки номери, що друкуються, - це символи ASCII, ми можемо оголосити тип поля date - CHAR. Основна проблема в тому, що ми повинні використовувати одиночні лапки кожного разу, коли посилаємося на значення підлогу odate в запиті. Ні більшецієї проблеми там, де тип DATЕ став таким популярним. Як ілюстрація, давайте оголосимо поле odate - типом CHAR. Ми можемо принаймні накласти на нього наш формат з обмеженням CHECK: CREATE TABLE Orders (10) NOT NULL CHECK (odate LIKE "--/--/--- -"), cnum NOT NULL, snum NOT NULL); Крім того, якщо ви хочете, ви можете накласти обмеження, що гарантують, що введені символи - числа, і що вони - в межах значень нашого діапазону.

ПЕРЕВІРКА УМОВ БАЗУЮЧИЙ НА БАГАТОЧИСНИХ ПОЛЯХ

Ви також можете використовувати CHECK як табличного обмеження. Це корисно в тих випадках, коли ви хочете включити більше одного пів рядка в умову. Припустимо, що комісійні.15 і вище, будуть дозволені тільки для продавця з Барселони. Ви можете вказати це з наступним табличним обмеженням.< .15 OR city = "Barcelona")); Как вы можете видеть, два различных пол должны быть проверены чтобы определить, верен предикат или нет. Имейте в виду, что это - два разных пол одной и той же строки. Хотя вы можете использовать многочисленные поля, SQL не может проверить более одной строки одновременно. Вы не можете например использовать ограничение CHECK чтобы удостовериться что все комиссионные в данном городе одинаковы. Чтобы сделать это, SQL должен всякий раз просматривая другие строки таблицы, когда вы модифицируете или вставляете строку, видеть, что значение комиссионных указано для текущего города. SQL этого делать не умеет.

Фактично, ви могли б використовувати складне обмеження CHECK для вищезгаданого, якби знали заздалегідь, які мають бути комісійні у різних містах. Наприклад, ви могли б встановити обмеження типу цього: CHECK ((comm = .15 AND clty = "London") OR (comm = .14 AND city = "Barcelona") OR (comm = 11 AND city = "San Jose") ..) Ви отримали ідею. Чим накладати такий комплекс обмежень, ви могли б просто використовувати подання з пропозицією WITH CHECK OPTION, яка має всі ці умови у своєму предикаті (див. Главу 20 і для інформації про подання та WITH CHECK OPTION). Користувачі можуть звертатися до представлення таблиці замість таблиці. Однією з переваг цього буде те, що процедура зміни в обмеженні не буде такою хворобливою чи трудомісткою. Подання з WITH CHECK OPTION - хороший замінник обмеження CHECK, що буде показано у Розділі 21 .

ВСТАНОВЛЕННЯ ЗНАЧЕНЬ ЗА УМОВЧЕННЯМ

Коли ви вставляєте рядок у таблицю без вказівки значень у ній для кожної підлоги, SQL повинен мати значення за промовчанням для включення його у певне поле, або команда буде відхилена. Найбільш загальним значенням за промовчанням є - NULL. Це значення за промовчанням для будь-якого стовпця, якому не було дано обмеження NOT NULL або який мав інше призначення за умовчанням.

Значення DEFAULT(ЗА УМОВЧАННЯМ) вказується в команді CREATE TABLE тим же способом, що і обмеження стовпця, хоча, з технічної точки зору, значення DEFAULT не обмежувального властивості - воно не обмежує значення які ви можете вводити, а просто визначає, що може статися якщо ви не введете будь-яку з них. Припустимо, що ви працюєте в офісі Нью-Йорка і переважна більшість ваших продавців живуть у Нью-Йорку. Ви можете вказати Нью Йорк як значення підлогу city, за замовчуванням, для вашої таблиці Продавців: CREATE TABLE Salespeople (snum integer NOT NULL UNIQUE, sname char(10) NOT NULL UNIQUE, city char(10) DEFAULT = "New York", comm decimal CHECK (comm< 1); Конечно, вводить значение Нью Йорк в таблицу каждый раз когда назначается новый продавец, не такая уж необходимость, и можно просто пренебречь им (не ввод его) даже если оно должно иметь некоторое значение. Значение по умолчанию такого типа, более предпочтительно, чем, например, длинный конторский номер указывающий на ваше собственное ведомство, в таблице Порядков. Длинные числовые значения - более расположены к ошибке, поэтому если подавляющее большинство (или все) ваших порядков должны иметь ваш собственный конторский номер, желательно устанавливать для них значение по умолчанию.

Інший спосіб використовувати значення за замовчуванням – це використовувати його як альтернативу для NULL. Так як NULL (фактично) невірний за будь-якого порівняння, іншому ніж IS NULL, він може бути виключений за допомогою більшості предикатів. Іноді, вам потрібно бачити порожні значення ваших полів, не обробляючи їх певним чином. Ви можете встановити значення за замовчуванням, типу нуль або пробіл, які функціонально менші за значенням, ніж просто не встановлене значення - порожнє значення (NULL). Відмінність між ними та звичайним NULL у тому, що SQL оброблятиме їх також як і будь-яке інше значення.

Припустимо, що замовникам не призначено оцінки спочатку. Кожні шість місяців, ви підвищуєте оцінку всім вашим замовникам, які мають оцінку нижче середньої, включаючи і тих, хто попередньо не мав жодного призначення оцінки. Якщо ви бажаєте вибрати всіх цих замовників як групу, наступний запит виключить усіх замовників з оцінкою = NULL: SELECT * FROM Customers WHERE rating< = 100; Однако, если вы назначили значение по умолчанию = 000, в поле rating, заказчики без оценок будут выбраны наряду с другими. Приоритет каждого метода - зависит от ситуации. Если вы будете делать запрос с помощью пол оценки, то захотите ли Вы включить строки без значений, или исключите их? Друга характеристика значений по умолчанию этого типа, позволит объявить Вам поле оценки - как NOT NULL. Если вы используете его по умолчанию, чтобы избежать значений = NULL, то это - вероятно хороша защита от ошибок.

Ви також можете використовувати обмеження UNIQUE або PRIMARY KEY в цьому полі. Якщо ви зробите це, то маєте на увазі, що тільки один рядок одночасно може мати значення за промовчанням. Будь-який рядок, який містить значення за замовчуванням, потрібно буде модифікувати, перш ніж другий рядок із установкою за замовчуванням буде вставлений. Це не так, як ви зазвичай використовуєте значення за промовчанням, тому обмеження UNIQUE та PRIMARY KEY (особливо останнє) зазвичай не встановлюються для рядків зі значеннями за умовчанням.

РЕЗЮМЕ

Ви тепер володієте кількома способами керування значеннями, які можуть бути введені у ваші таблиці. Ви можете використовувати обмеження NOT NULL щоб виключати NULL, обмеження UNIQUE щоб змушувати всі значення групи з одного або більше стовпців відрізнятися один від одного, обмеження PRIMARY KEY, для того щоб робити в основному те ж саме що і UNIQUE але з різним закінченням, і нарешті, обмеження CHECK для визначення ваших власних зроблених на замовлення умов, щоб значення зустріті перед ними могли б бути введені. Крім того, ви можете використовувати пропозицію DEFAULT, яка автоматично вставлятиме значення за промовчанням у будь-яке поле з ім'ям не вказаним в INSERT, так само як вставляється значення NULL коли пропозиція DEFAULT не встановлена ​​і відсутня обмеження NOT NULL. FOREIGN KEY або REFERENCES обмеження про які ви дізнаєтеся в Главі 19 дуже схожі на них, за винятком того, що вони пов'язують групу з одного або більше полів з іншою групою, і таким чином відразу впливають на значення, які можуть бути введені в будь-яку з цих груп .

РОБОТА З SQL

1. Створіть таблицю Порядків так щоб усі значення підлогу onum, а також всі комбінації полів cnum і snum відрізнялися один від одного, і так що значення NULL виключалися з поля дати.

2. Створіть таблицю Продавців так щоб комісійні, за замовчуванням, становили 10%, не дозволялися значення NULL, щоб поле snum було первинним ключем, і щоб усі імена були в алфавітному порядку між A і M включно (враховуючи, що всі імена будуть надруковані в верхньому регістрі).

3. Створіть таблицю Порядків, будучи впевненими, що поле onum більше ніж поле cnum, а cnum більше ніж snum. Заборонено значення NULL у будь-якому з цих трьох полів.

Останнє оновлення: 09.07.2017

При створенні стовпців у T-SQL ми можемо використовувати низку атрибутів, які є обмеженнями. Розглянемо ці атрибути.

PRIMARY KEY

За допомогою виразу PRIMARY KEY стовпець можна зробити первинним ключем.

CREATE TABLE Customers (Id INT PRIMARY KEY, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30), Phone VARCHAR(20))

Первинний ключ унікально ідентифікує рядок таблиці. Як первинний ключ необов'язково повинні виступати стовпці з типом int, вони можуть представляти будь-який інший тип.

Установка первинного ключа лише на рівні таблиці:

CREATE TABLE Customers (Id INT, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30), Phone VARCHAR(20), PRIMARY KEY(Id))

Первинний ключ може бути складеним (compound key). Такий ключ може знадобитися, якщо у нас одразу два стовпці мають унікально ідентифікувати рядок у таблиці. Наприклад:

CREATE TABLE OrderLines (OrderId INT, ProductId INT, Quantity INT, Price MONEY, PRIMARY KEY(OrderId, ProductId))

Тут поля OrderId та ProductId разом виступають як складовий первинний ключ. Тобто в таблиці OrderLines не може бути двох рядків, де для обох з цих полів одночасно були б ті самі значення.

IDENTITY

Атрибут IDENTITY дозволяє зробити стовпець ідентифікатором. Цей атрибут може бути призначений для стовпців числових типів INT, SMALLINT, BIGINT, TYNIINT, DECIMAL і NUMERIC. При додаванні нових даних до таблиці SQL Server інкрементуватиме на одиницю значення цього стовпця у останнього запису. Як правило, у ролі ідентифікатора виступає той самий стовпець, який є первинним ключем, хоча в принципі це необов'язково.

CREATE TABLE Customers (Id INT PRIMARY KEY IDENTITY, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30), Phone VARCHAR(20))

Також можна використовувати повну форму атрибуту:

IDENTITY(seed, increment)

Тут параметр seed вказує на початкове значення, з якого починатиметься відлік. А параметр increment визначає, наскільки збільшуватиметься таке значення. За умовчанням атрибут використовує такі значення:

IDENTITY(1, 1)

Тобто, відлік починається з 1. А наступні значення збільшуються на одиницю. Але ми можемо цю поведінку перевизначити. Наприклад:

Id INT IDENTITY (2, 3)

В даному випадку відлік почнеться з 2, а значення кожного наступного запису буде збільшуватися на 3. Тобто перший рядок матиме значення 2, другий - 5, третій - 8 і т.д.

Також слід враховувати, що у таблиці лише один стовпець повинен мати такий атрибут.

UNIQUE

Якщо ми хочемо, щоб стовпець мав лише унікальні значення, то для нього можна визначити атрибут UNIQUE.

CREATE TABLE Customers (Id INT PRIMARY KEY IDENTITY, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE)

В даному випадку стовпці, які представляють електронна адресаі телефон буде мати унікальні значення. І ми не зможемо додати до таблиці два рядки, які мають значення для цих стовпців співпадати.

Також ми можемо визначити цей атрибут на рівні таблиці:

CREATE TABLE Customers (Id INT PRIMARY KEY IDENTITY, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30), Phone VARCHAR(20), UNIQUE(Email, Phone))

NULL та NOT NULL

Щоб вказати, чи може стовпець приймати значення NULL, при визначенні стовпця можна задати атрибут NULL або NOT NULL . Якщо цей атрибут явно не буде використаний, то за умовчанням стовпець допускатиме значення NULL. Винятком є ​​той випадок, коли стовпець виступає ролі первинного ключа - у разі за умовчанням стовпець має значення NOT NULL.

CREATE TABLE Customers (Id INT PRIMARY KEY IDENTITY, Age INT, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE)

DEFAULT

Атрибут DEFAULT визначає значення за промовчанням для стовпця. Якщо при додаванні даних для стовпця не буде передбачено значення, то для нього використовуватиметься значення за замовчуванням.

CREATE TABLE Customers (Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE

Тут для стовпця Age передбачено значення за промовчанням 18.

CHECK

Ключове слово CHECK визначає обмеження для діапазону значень, які можуть зберігатися в стовпці. Для цього після слова CHECK вказується в дужках умова, якій має відповідати стовпець або кілька стовпців. Наприклад, вік клієнтів не може бути меншим за 0 або більше 100:

CREATE TABLE Customers (Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18 CHECK(Age >0 AND Age< 100), FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE CHECK(Email !=""), Phone VARCHAR(20) UNIQUE CHECK(Phone !=""));

Тут також вказується, що стовпці Email і Phone не можуть мати порожній рядок як значення (порожній рядок не еквівалентний NULL).

Для з'єднання умов використовується ключове слово AND. Умови можна задати у вигляді операцій порівняння більше (>), менше (<), не равно (!=).

Також за допомогою CHECK можна створити обмеження загалом для таблиці:

CREATE TABLE Customers (Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNI 0 AND Age<100) AND (Email !="") AND (Phone !="")))

Оператор CONSTRAINT. Встановлення імені обмежень.

За допомогою ключового слова CONSTRAINT можна встановити ім'я для обмежень. Як обмеження можуть використовуватися PRIMARY KEY, UNIQUE, DEFAULT, CHECK.

Імена обмежень можна встановити на рівні стовпців. Вони вказуються після CONSTRAINT перед атрибутами:

CREATE TABLE Customers (Id INT CONSTRAINT PK_Customer_Id PRIMARY KEY IDENTITY, Age INT CONSTRAINT DF_Customer_Age DEFAULT 18 CONSTRAINT CK_Customer_Age CHECK(Age >0 AND Age< 100), FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) CONSTRAINT UQ_Customer_Email UNIQUE, Phone VARCHAR(20) CONSTRAINT UQ_Customer_Phone UNIQUE)

Обмеження можуть носити довільні назви, але, як правило, застосовуються такі префікси:

    "PK_" - для PRIMARY KEY

    "FK_" - для FOREIGN KEY

    "CK_" - для CHECK

    "UQ_" - для UNIQUE

    "DF_" - для DEFAULT

В принципі необов'язково вказувати імена обмежень, при установці відповідних атрибутів SQL Server автоматично визначає їх імена. Але знаючи ім'я обмеження, ми можемо до нього звертатися, наприклад, для його видалення.

Також можна задати всі імена обмежень через атрибути таблиці:

CREATE TABLE Customers (Id INT IDENTITY, Age INT CONSTRAINT DF_Customer_Age DEFAULT 18, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30), Телефон VARCHAR(20) , CONSTRAINT CK_Customer_Age CHECK(Age >0 AND Age< 100), CONSTRAINT UQ_Customer_Email UNIQUE (Email), CONSTRAINT UQ_Customer_Phone UNIQUE (Phone))

УНІКАЛЬНЕ обмеження однозначно ідентифікує кожен запис у таблиці бази даних.

Унікально та PRIMARY KEY обмеження стовпець або набір стовпців забезпечує унікальність гарантії.

PRIMARY KEY обмеження автоматично має обмеження унікальності визначено.

Зауважте, що кожна таблиця може мати кілька обмежень унікальності, але кожна таблиця може мати лише одне обмеження первинного ключа.

CREATE TABLE SQL UNIQUE обмеження коли

Наступний SQL, коли "Обличчя" таблиця була створена, щоб створити унікальне обмеження на колонці "p_id":

CREATE TABLE Persons
P_Id int NOT NULL,

FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

Для того, щоб назвати унікальні обмеження UNIQUE обмеження та визначити кілька стовпців, використовуйте наступний синтаксис SQL:

CREATE TABLE Persons
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)

SQL UNIQUE обмеження ALTER TABLE у

Коли таблиця була створена, створити обмеження унікальності у стовпці "p_id", будь ласка, використовуйте наступний SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD UNIQUE (P_Id)

Для того, щоб назвати унікальні обмеження UNIQUE обмеження та визначити кілька стовпців, використовуйте наступний синтаксис SQL.

Про межу унікальності запобігає створенню двох записів з тих, що мають однакові значенняу стовпці. У таблиці CUSTOMERS, наприклад, ви можете захотіти створити два або більше людей, які мають однаковий вік.

приклад

Наприклад, наступний SQL запит створює нову таблицю з ім'ям CUSTOMERS і додає п'ять стовпців. Тут стовпець AGE встановлено в UNIQUE, так що ви не можете мати два записи з тим самим віком.

CREATE TABLE CUSTOMERS(ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL UNIQUE, ADDRESS CHAR (25) , SALARY DECIMAL (18, 2), PRIMARY KEY (ID));

Якщо таблиця CUSTOMERS вже створена, якщо ви хочете додати обмеження UNIQUE на колонку AGE, ви повинні написати заяву, як запит, який задається в блоці коду нижче.

ALTER TABLE CUSTOMERS MODIFY AGE INT NOT NULL UNIQUE;

Ви також можете використовувати наступний синтаксис, який підтримує обмеження надання імен у кількох стовпцях.

ALTER TABLE CUSTOMERS ADD CONSTRAINT myUniqueConstraint UNIQUE(AGE, SALARY);

Видалення обмежень UNIQUE

Щоб видалити обмеження UNIQUE, використовуйте наступний запит SQL.



gastroguru 2017