Cách thêm khóa ngoại trong SQL
Khóa ngoại là một thuộc tính hoặc một tập hợp các thuộc tính tham chiếu đến khóa chính của cùng một bảng hoặc một bảng (quan hệ) khác.
- Tạo khóa ngoại cùng với tạo bảng
Khóa ngoại có thể được tạo ngay cả khi tạo bảng.
Cú pháp:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Ví dụ:
Đầu tiên, chúng tôi sẽ tạo một cơ sở dữ liệu có tên “ Employeedb ”. Sau đó, trong cơ sở dữ liệu đó, chúng ta sẽ tạo hai bảng “nhân viên” và “bộ phận”. Chúng tôi sẽ xem xét các bảng và cơ sở dữ liệu này cho tất cả các ví dụ tiếp theo.
Chúng tôi sẽ tạo khóa chính và khóa ngoại trong khi tạo bảng “nhân viên” và “phòng ban” tương ứng.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.07 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | Emp_ID | int(11) | NO | PRI | NULL | | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 3 rows in set (0.09 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID)); Query OK, 0 rows affected (0.20 sec) mysql> DESC department; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Dept_ID | int(11) | NO | PRI | NULL | | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.02 sec)
Chúng tôi đã tạo hai khóa chính “Emp_ID” cho bảng “nhân viên”, “Dept_ID” cho bảng “phòng ban” và “Emp_ID” làm khóa ngoại cho bảng “phòng ban” trong khi tạo bảng. Để xác minh xem các khóa có được thêm vào bảng hay không, chúng tôi đã sử dụng lệnh DESC.
- Tạo khóa ngoại với tên ràng buộc
Khóa ngoại có thể được tạo ngay cả tại thời điểm tạo bảng cùng với tên ràng buộc. Tên ràng buộc này sẽ hữu ích khi loại bỏ khóa ngoại khỏi bảng mà không bỏ toàn bộ bảng.
Cú pháp:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Ví dụ:
Chúng tôi sẽ tạo khóa chính và khóa ngoại trong khi tạo bảng “nhân viên” và “phòng ban” tương ứng. Khóa ngoại sẽ được tạo cùng với ràng buộc khóa ngoại trong khi tạo chính bảng.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.11 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | Emp_ID | int(11) | NO | PRI | NULL | | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, CONSTRAINT emp_id_fk FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID)); Query OK, 0 rows affected (0.25 sec) mysql> DESC department; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Dept_ID | int(11) | NO | PRI | NULL | | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.04 sec)
Chúng tôi đã tạo hai khóa chính “Emp_ID” cho bảng “nhân viên”, “Dept_ID” cho bảng “phòng ban” và “Emp_ID” làm khóa ngoại cho bảng “phòng ban” trong khi tạo bảng. Ở đây, chúng tôi cũng đã thêm ràng buộc khóa ngoại có tên là “emp_id_fk”. Để xác minh xem các khóa có được thêm vào bảng hay không, chúng tôi đã sử dụng lệnh DESC.
- Tạo khóa ngoại bằng lệnh ALTER
Có thể tạo khóa ngoại ngay cả sau khi tạo bảng. Trong khi tạo bảng nếu chúng ta chưa thêm khóa ngoại vào đó và sau đó chúng ta cần thêm khóa ngoại vào bảng hiện có thì chúng ta sẽ sử dụng lệnh ALTER trong trường hợp đó.
Cú pháp:
ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);
Ví dụ:
Chúng tôi sẽ thêm khóa ngoại vào bảng hiện có bằng lệnh ALTER.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.16 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | Emp_ID | int(11) | NO | PRI | NULL | auto_increment | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL); Query OK, 0 rows affected (0.12 sec) mysql> ALTER TABLE department ADD FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID); Query OK, 0 rows affected (0.23 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC department; +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | Dept_ID | int(11) | NO | PRI | NULL | auto_increment | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec)
Chúng tôi đã tạo hai khóa chính “Emp_ID” cho bảng “nhân viên” và “Dept_ID” cho bảng “bộ phận” trong khi tạo bảng. Sau đó, sử dụng lệnh ALTER, chúng tôi đã thêm “Emp_ID” làm khóa ngoại vào bảng bộ phận. Để xác minh xem các khóa có được thêm vào bảng hay không, chúng tôi đã sử dụng lệnh DESC.