sql >> Databáze >  >> RDS >> Database

Jak přidat cizí klíč do SQL?

Jak přidat cizí klíč v SQL

Cizí klíč je atribut nebo sada atributů, které odkazují na primární klíč stejné tabulky nebo jiné tabulky (relace).

  • Vytvoření cizího klíče spolu s vytvořením tabulky

Cizí klíč lze vytvořit i v době vytváření tabulek.

Syntaxe:

CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));

Příklad:

Nejprve vytvoříme databázi s názvem „employeedb “. Poté v této databázi vytvoříme dvě tabulky „zaměstnanec“ a „oddělení“. Tyto tabulky a databázi zvážíme pro všechny následující příklady.

Při vytváření tabulek „zaměstnanec“ a „oddělení“ vytvoříme primární klíč a cizí klíč.

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) 

Při vytváření tabulek jsme vytvořili dva primární klíče „Emp_ID“ k tabulce „zaměstnanců“, „Dept_ID“ k tabulce „oddělení“ a „Emp_ID“ jako cizí klíč k tabulce „oddělení“. Pro ověření, zda jsou klíče přidány do tabulek nebo ne, jsme použili příkaz DESC.

  • Vytvoření cizího klíče s názvem omezení

Cizí klíč lze vytvořit i při vytváření tabulek spolu s názvem omezení. Tento název omezení bude užitečný při odstraňování cizího klíče z tabulky bez vypuštění celé tabulky.

Syntaxe:

CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));

Příklad:

Při vytváření tabulek „zaměstnanec“ a „oddělení“ vytvoříme primární klíč a cizí klíč. Cizí klíč bude vytvořen spolu s omezením cizího klíče při vytváření samotné tabulky.

 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) 

Při vytváření tabulek jsme vytvořili dva primární klíče „Emp_ID“ k tabulce „zaměstnanců“, „Dept_ID“ k tabulce „oddělení“ a „Emp_ID“ jako cizí klíč k tabulce „oddělení“. Zde jsme také přidali omezení cizího klíče s názvem „emp_id_fk“. Pro ověření, zda jsou klíče přidány do tabulek nebo ne, jsme použili příkaz DESC.

  • Vytvoření cizího klíče pomocí příkazu ALTER

Cizí klíč je možné vytvořit i po vytvoření tabulky. Při vytváření tabulky, pokud jsme do ní nepřidali cizí klíč a poté potřebujeme přidat cizí klíč do existující tabulky, použijeme v tomto případě příkaz ALTER.

Syntaxe:

ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);

Příklad:

Do existující tabulky přidáme cizí klíč pomocí příkazu 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) 

Při vytváření tabulek jsme vytvořili dva primární klíče „Emp_ID“ do tabulky „zaměstnanců“ a „Dept_ID“ do tabulky „oddělení“. Poté pomocí příkazu ALTER jsme přidali „Emp_ID“ jako cizí klíč do tabulky oddělení. Pro ověření, zda jsou klíče přidány do tabulek nebo ne, jsme použili příkaz DESC.


  1. Převést schéma MySQL na Github Wiki?

  2. HikariCP:Jaké časové limity na úrovni databáze je třeba vzít v úvahu při nastavení maxLifetime pro Oracle 11g

  3. Změní se ID prostředku při každém spuštění aplikace

  4. Jaké jsou rozdíly mezi INSERT a UPDATE v MySQL?