Loading...

Тышкы ачкычтар FOREIGN KEY

Чет өлкөлүк ачкычтар таблицалардын ортосунда мамилелерди түзүүгө мүмкүндүк берет. Чет өлкөлүк ачкыч көз каранды, баш ийген столдун колонналары үчүн белгиленген жана негизги таблицадан колонналардын бирин көрсөтүп турат. Адатта, чет өлкөлүк ачкыч байланышкан мастер-столдун негизги ачкычын көрсөтүп турат. 

Таблица деңгээлинде чет өлкөлүк ачкычты орнотуу үчүн жалпы синтакс төмөнкүдөй: 

@A@[CONSTRAINT имя_ограничения] 

FOREIGN KEY (столбец1, столбец2, ... столбецN)  

REFERENCES главная_таблица (столбец_главной_таблицы1, столбец_главной_таблицы2, ... столбец_главной_таблицыN) 

[ON DELETE действие] 

[ON UPDATE действие] @A@

Чет өлкөлүк негизги чектөөлөрдү түзүү үчүн, FOREIGN KEY, чет өлкөлүк ачкычты чагылдыра турган таблица колоннасын көрсөткүлө. Ал эми REFERENCES ачкыч сөздөрүнөн кийин сиз байланыштуу таблицанын атын көрсөтөсүңөр, андан кийин чет өлкөлүк ачкыч көрсөтө турган тиешелүү колоннанын аты менен ата-энелердин ысмын көрсөтөсүңөр. ON DELETE жана ON UPDATE билдирүүлөр көрсөтүлөт, анда негизги таблицадан катар жоготулганда жана жаңыртылган учурда кабыл алынышы керек болгон иш-чаралар көрсөтүлөт. 

Мисалы, келгиле, эки таблицаны аныктап, аларды чет өлкөлүк ачкычтын жардамы менен бири-бири менен байланыштыралы: 

@A@CREATE TABLE Customers 

    Id INT PRIMARY KEY AUTO_INCREMENT, 

    Age INT,  

    FirstName VARCHAR(20) NOT NULL, 

    LastName VARCHAR(20) NOT NULL, 

    Phone VARCHAR(20) NOT NULL UNIQUE 

); @A@

  

@A@CREATE TABLE Orders 

    Id INT PRIMARY KEY AUTO_INCREMENT, 

    CustomerId INT, 

    CreatedAt Date, 

    FOREIGN KEY (CustomerId)  REFERENCES Customers (Id) 

); @A@

Бул учурда Customers и Orders таблицалары аныкталат. Customers негизги болуп саналат жана кардарды билдирет. Orders көз каранды жана кардар тарабынан жасалган тартипти билдирет. Orders таблицасы, CustomerId колоннасы аркылуу Customers столуна жана анын идентификатор колоннасына байланыштуу. Башкача айтканда, CustomerId колоннасы Кардарлар столунан Id колоннасын көрсөткөн Customers  болуп саналат. 

Чет өлкөлүк негизги чектөөнүн атын көрсөтүү үчүн CONSTRAINT колдонсоңор болот: 

@A@CREATE TABLE Orders 

    Id INT PRIMARY KEY AUTO_INCREMENT, 

    CustomerId INT, 

    CreatedAt Date, 

    CONSTRAINT orders_custonmers_fk  

    FOREIGN KEY (CustomerId)  REFERENCES Customers (Id) 

); @A@

ON DELETE и ON UPDATE 

Сиз негизги таблицадан тиешелүү катарды жоготуп, өзгөрткөндө эмне болорун көрсөтүү үчүн ON DELETE и ON UPDATE  билдирүүлөрүн колдоно аласыз. Төмөнкү параметрлерди иш-аракет катары колдонууга болот: 

  • CASCADE: Мастер-столдо байланыштуу катарларды жоготуп же өзгөрткөндө, көз каранды столдон катарларды автоматтык түрдө алып салуу же өзгөртүү. 

  • SET NULL:Негизги таблицадан байланыштуу катар жоготулганда же жаңыртылганда, чет өлкөлүк негизги колоннаны жокко чыгарууга орнотот. (Бул учурда чет өлкөлүк негизги колонна жок болушу керек) 

  • RESTRICT: көз каранды столдо байланыштуу катарлар болгондо баштапкы столдо катарларды жоготуу же өзгөртүү четке кагат. 

  • NO ACTION: RESTRICT менен бирдей. 

  • SET DEFAULT: при удалении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение по умолчанию, которое задается с помощью атрибуты DEFAULT. Несмотря на то, что данная опция в принципе доступна, однако движок InnoDB не поддерживает данное выражение. 

Каскадное удаление 

Каскадинг жоготуу негизги столдон бир катар жоготуп жатканда көз каранды столдон бардык байланыштуу катарларды автоматтык түрдө алып салууга мүмкүндүк берет. Бул максатта CASCADE опциясы колдонулат: 

ON UPDATE CASCADE. да ушундай жол менен иштейт. Негизги ачкычтын наркын өзгөртсөңөр, аны менен байланышкан чет өлкөлүк ачкычтын наркы автоматтык түрдө өзгөрөт. Бирок, баштапкы ачкычтар абдан сейрек өзгөргөндүктөн жана жалпысынан мутацияланган колонналарды негизги ачкычтар катары колдонуу сунуш кылынбагандыктан, ON UPDATE экспрессиясы практикада сейрек колдонулат. 

NULL орнотуу 

SET NULL үчүн чет өлкөлүк ачкычты орноткондо, чет өлкөлүк негизги колоннанын жокко чыгарууга мүмкүн эмес экенин камсыз кылуу керек: 

 

@A@CREATE TABLE Orders 

    Id INT PRIMARY KEY AUTO_INCREMENT, 

    CustomerId INT, 

    CreatedAt Date, 

    FOREIGN KEY (CustomerId) REFERENCES Customers (Id) ON DELETE CASCADE 

); @A@

@A@CREATE TABLE Orders 

    Id INT PRIMARY KEY AUTO_INCREMENT, 

    CustomerId INT, 

    CreatedAt Date, 

    FOREIGN KEY (CustomerId) REFERENCES Customers (Id) ON DELETE SET NULL 

); @A@