SQL外键
设计数据库表时,重要的因素是确保该表具有足够的可伸缩性并同时进行规范化。
为了确保表之间的链接和规范化,我们使用SQL外键。
SQL外键
外键由与另一个表的列匹配的列定义。
外键约束用于确保保持数据引用完整性。
在本教程中,我们将尝试理解以下主题。
- 创建外键
- 添加外键
- 删除外键
1.创建一个外键
下面提到的语法将有助于理解如何在子表中创建外键。
子表是从父表定义外键的表。
语法:
CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action
请在下面找到上述语法的详细信息,
约束:–此关键字允许为外键约束指定名称。
外键:–此关键字指定子表中引用父表主键的列。
参考:-它指定父表及其用作外键的列。
删除时:-删除时指定将在删除父表的一行时执行的操作。
更新时:–更新时指定将在更新父表的一行时执行的操作。
我们将使用以下内容创建一个新表
CREATE TABLE school( sch_id int not null auto_increment primary key, sch_name varchar(255) not null, sch_description text ) ; CREATE TABLE student( std_id int not null auto_increment primary key, std_name varchar(355) not null, std_class varchar(355) not null, sch_id int not null, FOREIGN KEY fk_sch(sch_id) REFERENCES school(sch_id) ON UPDATE CASCADE ON DELETE RESTRICT );
使用上面的查询,我们将创建两个表School和Student。
School是Student表的父表,并且具有相同的外键引用。
执行完上面的查询后,以下将是Student表的属性。
2.添加外键
下面提到的语法将有助于理解如何在子表中添加外键。
使用Alter关键字,我们可以将外键添加到现有表中。
语法:
ALTER table_name ADD CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action
我们将尝试将新的外键添加到在上一个示例中创建的Student表中。
CREATE TABLE class( cls_id int not null auto_increment primary key, cls_name varchar(255) ); ALTER TABLE student ADD COLUMN cls_id int not null; ALTER TABLE student Add FOREIGN KEY fk_cls(cls_id) REFERENCES class(cls_id) ON DELETE NO ACTION ON UPDATE CASCADE;
使用上面的查询,我们将创建一个新的表Class并将一个外键添加到Student表中
执行完上面的查询后,以下将是Student表的属性。
3.删除外键
下面提到的语法将有助于理解如何在子表中删除外键。
使用Alter关键字,我们可以将外键拖放到现有表中。
语法:
ALTER table_name <span class="crayon-st">DROP <span class="crayon-st">FOREIGN KEY constraint_name;
我们将尝试从上一个示例中创建的Student表中删除外键。
ALTER TABLE student DROP FOREIGN KEY fk_cls;
使用上面的查询,我们将删除学生表的外键
执行完上面的查询后,以下将是Student表的属性。
删除级联中的外键如何工作?
我们可以使用以下查询为外键约束设置" ON DELETE CASCADE"选项。
在这种情况下,如果删除父表中的相应行,则子表中的行也将被删除。
让我们将其添加到学生表中。
ALTER TABLE student Add FOREIGN KEY fk_sch(sch_id) REFERENCES school(sch_id) ON DELETE CASCADE;
我们将运行以下命令将数据插入School表。
学校表:
INSERT INTO `test`.`school` ( `sch_name`, `sch_description`) VALUES("TestSchool1","School for test 1"),("TestSchool2","School for test 2"),("TestSchool3","School for test 3");
学生桌:
INSERT INTO `test`.`student` ( `std_name`, `std_class`, `sch_id`, `cls_id`) VALUES("Student 1","Class 1",1,1),("Student 2","Class 1",2,1)("Student 3","Class 1",1,1),("Student 4","Class 1",1,1),("Student 5","Class 1",3,1),("Student 6","Class 1",3,1);
现在,我们将尝试使用以下命令从子表中删除一行。
DELETE FROM `test`.`student` WHERE sch_id = 2
这只会从sch_id = 2的子表中删除该条目,而父表将保持不变。
删除后的学生表
现在,我们将尝试从父表中删除一个条目,我们将在子表中看到相同的更改。
我们将执行以下命令从父表中删除行。
DELETE FROM `test`.`school` WHERE sch_id=3;
以下是父表的delete命令执行后的结果。
子表中的行也将被删除。