Как да добавите външен ключ в SQL
Външният ключ е атрибут или набор от атрибути, който препраща към първичен ключ на същата таблица или друга таблица (релация).
- Създаване на външен ключ заедно със създаване на таблица
Външен ключ може да бъде създаден дори в момента на създаване на таблици.
Синтаксис:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Пример:
Първо, ще създадем база данни с име „employeedb “. След това в тази база данни ще създадем две таблици „служител“ и „отдел“. Ще разгледаме тези таблици и база данни за всички следващи примери.
Ще създадем първичен ключ и външен ключ, докато създаваме съответно таблиците „служител“ и „отдел“.
mysql> ИЗПОЛЗВАЙТЕ employeedb; Базата данни е променена mysql> CREATE TABLE служител(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Заявка OK, 0 засегнати реда (0,07 сек) mysql> DESC служител; +-----------+------------+------+-----+--------- +-------+ | Поле | Въведете | Null | Ключ | По подразбиране | Екстра | +-----------+------------+------+-----+--------- +-------+ | Emp_ID | int(11) | НЕ | PRI | NULL | | | Emp_Name | varchar(40) | ДА | | NULL | | | Emp_Заплата | varchar(40) | ДА | | NULL | | +-----------+------------+------+-----+--------- +-------+ 3 реда в набор (0,09 сек) mysql> СЪЗДАВАНЕ НА ТАБЛИЦА отдел(Dept_ID INT НЕ НУЛЕН ПЪРВЕН КЛЮЧ, Dept_Name VARCHAR(40), Emp_ID INT НЕ НУЛ, ВЪНШЕН КЛЮЧ(Emp_ID) REFERENCES служител(Emp_ID) )); Заявка OK, засегнати 0 реда (0,20 сек) mysql> DESC отдел; +-----------+------------+------+-----+---------+ -------+ | Поле | Въведете | Null | Ключ | По подразбиране | Екстра | +-----------+------------+------+-----+---------+ -------+ | Dept_ID | int(11) | НЕ | PRI | NULL | | | Dept_Name | varchar(40) | ДА | | NULL | | | Emp_ID | int(11) | НЕ | МУЛ | NULL | | +-----------+------------+------+-----+---------+ -------+ 3 реда в комплект (0,02 сек.)
Създадохме два първични ключа „Emp_ID“ към таблица „служител“, „Dept_ID“ към таблицата „department“ и „Emp_ID“ като външен ключ към таблицата „department“, докато създаваме таблици. За да проверим дали ключовете са добавени към таблици или не, използвахме команда DESC.
- Създаване на външен ключ с име на ограничение
Външен ключ може да бъде създаден дори в момента на създаване на таблици заедно с името на ограничението. Това име на ограничение ще бъде полезно, когато изпускате външен ключ от таблица, без да изпускате цяла таблица.
Синтаксис:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));Пример:
Ще създадем първичен ключ и външен ключ, докато създаваме съответно таблиците „служител“ и „отдел“. Външният ключ ще бъде създаден заедно с ограничението за външния ключ при създаването на самата таблица.
mysql> ИЗПОЛЗВАЙТЕ employeedb; Базата данни е променена mysql> CREATE TABLE служител(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Заявка OK, 0 засегнати реда (0,11 сек) mysql> DESC служител; +-----------+------------+------+-----+--------- +-------+ | Поле | Въведете | Null | Ключ | По подразбиране | Екстра | +-----------+------------+------+-----+--------- +-------+ | Emp_ID | int(11) | НЕ | PRI | NULL | | | Emp_Name | varchar(40) | ДА | | NULL | | | Emp_Заплата | varchar(40) | ДА | | NULL | | +-----------+------------+------+-----+--------- +-------+ 3 реда в комплект (0.01 сек) mysql> СЪЗДАВАНЕ НА ТАБЛИЦА отдел (Dept_ID INT НЕ НУЛЕН ПЪРВЕН КЛЮЧ, Dept_Name VARCHAR(40), Emp_ID INT НЕ НУЛЕН, ОГРАНИЧЕНИЕ emp_id_fk ВЪНШЕН КЛЮЧ(Emp_ID) служи на REFE (Emp_ID)); Заявка OK, засегнати 0 реда (0,25 сек) mysql> DESC отдел; +-----------+------------+------+-----+---------+ -------+ | Поле | Въведете | Null | Ключ | По подразбиране | Екстра | +-----------+------------+------+-----+---------+ -------+ | Dept_ID | int(11) | НЕ | PRI | NULL | | | Dept_Name | varchar(40) | ДА | | NULL | | | Emp_ID | int(11) | НЕ | МУЛ | NULL | | +-----------+------------+------+-----+---------+ -------+ 3 реда в комплект (0,04 сек)Създадохме два първични ключа „Emp_ID“ към таблица „служител“, „Dept_ID“ към таблицата „department“ и „Emp_ID“ като външен ключ към таблицата „department“, докато създаваме таблици. Тук също добавихме ограничение за външен ключ, наречено „emp_id_fk“. За да проверим дали ключовете са добавени към таблици или не, използвахме команда DESC.
- Създаване на външен ключ чрез команда ALTER
Възможно е да се създаде външен ключ дори след създаване на таблица. Докато създаваме таблица, ако не сме добавили външен ключ към нея и след това трябва да добавим външния ключ към съществуваща таблица, тогава ще използваме команда ALTER в този случай.
Синтаксис:
ALTER TABLE Parent_TableName ДОБАВЯНЕ НА ВЪНШЕН КЛЮЧ(Име на колона) РЕФЕРЕНЦИИ Child_TableName(ColumnName);
Пример:
Ще добавим външен ключ към съществуваща таблица с помощта на командата ALTER.
mysql> ИЗПОЛЗВАЙТЕ employeedb; Базата данни е променена mysql> CREATE TABLE служител(Emp_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Заявка OK, засегнати 0 реда (0,16 сек) mysql> DESC служител; +-----------+------------+------+-----+--------- +----------------+ | Поле | Въведете | Null | Ключ | По подразбиране | Екстра | +-----------+------------+------+-----+--------- +----------------+ | Emp_ID | int(11) | НЕ | PRI | NULL | автоматично_инкремент | | Emp_Name | varchar(40) | ДА | | NULL | | | Emp_Заплата | varchar(40) | ДА | | NULL | | +-----------+------------+------+-----+--------- +----------------+ 3 реда в набор (0,01 сек) mysql> СЪЗДАВАНЕ НА ТАБЛИЦА отдел (Dept_ID INT NOT NULL ПРАВИЛЕН КЛЮЧ AUTO_INCREMENT, Dept_Name VARCHAR(40), Emp_ID INT НЕ NULL ); Заявка OK, 0 засегнати реда (0,12 сек) mysql> ПРОМЕНИ ТАБЛИЦА отдел ДОБАВЯНЕ НА ВЪНШЕН КЛЮЧ(Emp_ID) РЕФЕРЕНЦИИ служител(Emp_ID); Заявката OK, 0 засегнати реда (0,23 сек) Записи:0 Дублирани:0 Предупреждения:0 mysql> DESC отдел; +-----------+------------+------+-----+---------+ ----------------+ | Поле | Въведете | Null | Ключ | По подразбиране | Екстра | +-----------+------------+------+-----+---------+ ----------------+ | Dept_ID | int(11) | НЕ | PRI | NULL | автоматично_инкремент | | Dept_Name | varchar(40) | ДА | | NULL | | | Emp_ID | int(11) | НЕ | МУЛ | NULL | | +-----------+------------+------+-----+---------+ ----------------+ 3 реда в комплект (0,01 сек)
Създадохме два първични ключа „Emp_ID“ към таблица „служител“ и „Dept_ID“ към таблицата „department“, докато създаваме таблици. След това с помощта на командата ALTER добавихме “Emp_ID” като външен ключ към таблицата на отделите. За да проверим дали ключовете са добавени към таблици или не, използвахме команда DESC.