在本教程中,将学习SQL外键以及如何创建FOREIGN KEY约束以强制表之间的关系。

1. SQL外键约束简介

外键是一列或一组列,用于强制两个表中的数据之间的链接。 在外键引用中,第一个表的主键列(或多个列)由第二个表的列(或列)引用。 第二个表的列(或列)成为外键。

在创建或更改表时,可以使用FOREIGN KEY约束创建外键。 下面来看一个简单的例子以更好地理解。

2. SQL FOREIGN KEY约束示例

请参阅以下project表和project_assignments表:

CREATE TABLE projects (

project_id INT AUTO_INCREMENT PRIMARY KEY,

project_name VARCHAR(255),

start_date DATE NOT NULL,

end_date DATE NOT NULL

);

CREATE TABLE project_milestones(

milestone_id INT AUTO_INCREMENT PRIMARY KEY,

project_id INT,

milestone_name VARCHAR(100)

);

每个项目可能有零个或多个里程碑,而一个里程碑必须属于一个且只有一个项目。 使用这些表的应用程序必须确保project_milestones表中的每一行都在projects表中存在相应的行。 换句话说,没有项目就不可能存在里程碑。

不幸的是,用户可能使用客户端工具编辑数据库,或者如果应用程序中存在错误,则可能会在project_milestones表中添加一行,该行不对应于项目表中的任何行。 或者用户可以删除项目表中的行,在project_milestones表中留下孤立的行。 这会导致应用程序无法正常工作。

解决方案是向project_milestones表添加SQL FOREIGN KEY约束,以强制执行project表和project_milestones表之间的关系。

可以在创建表时创建FOREIGN KEY约束,如下所示:

CREATE TABLE project_milestones (

milestone_id INT AUTO_INCREMENT PRIMARY KEY,

project_id INT,

milestone_name VARCHAR(100),

FOREIGN KEY (project_id)

REFERENCES projects (project_id)

);

FOREIGN KEY子句将project_milestones表的project_id设置为引用project表的project_id列的外键。

FOREIGN KEY (project_id)

REFERENCES projects (project_id)

可以为FOREIGN KEY约束指定名称,如下所示:

CREATE TABLE project_milestones (

milestone_id INT AUTO_INCREMENT PRIMARY KEY,

project_id INT,

milestone_name VARCHAR(100),

CONSTRAINT fk_project FOREIGN KEY (project_id)

REFERENCES projects (project_id)

);

hk_project是FOREIGN KEY约束的名称。将FOREIGN KEY约束添加到现有表

,要向现有表添加FOREIGN KEY约束,请使用ALTER TABLE语句。

ALTER TABLE table_1

ADD CONSTRAINT fk_name FOREIGN KEY (fk_key_column)

REFERENCES table_2(pk_key_column)

假设project_milestones列已经存在,但是没有任何预定义的外键,如果想要为project_id列定义FOREIGN KEY约束。 为此,请使用以下ALTER TABLE语句:

ALTER TABLE project_milestones

ADD CONSTRAINT fk_project FOREIGN KEY(project_id)

REFERENCES projects(project_id);

3. 删除外键约束

要删除外键约束,还要使用ALTER TABLE语句,如下所示:

ALTER TABLE table_name

DROP CONSTRAINT fk_name;

如果使用的是MySQL,则可以使用更清晰的语法,如下所示:

ALTER TABLE table_name

DROP FOREIGN KEY fk_name;

例如,要删除fk_project外键约束,请使用以下语句:

ALTER TABLE project_milestones

DROP CONSTRAINT fk_project;

在本教程中,我们介绍了外键概念,并演示了如何使用SQL FOREIGN KEY约束创建和删除外键。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

sql外键需要输入吗_SQL外键相关推荐

  1. sql外键需要输入吗_关于sql:为什么在没有连接的情况下可以联接,为什么需要主-外键关系?...

    如果我们可以从两个表中获取数据而又没有主键和外键关系,那为什么我们需要这个规则? 你能用合适的例子清楚地解释我吗? 这是一个测试数据库,不要介意不良的结构. 表的结构: ** TABLE - 'tes ...

  2. sql外键_SQL外键

    sql外键 In this article let us review different ways to create a SQL foreign key, rules on updates and ...

  3. 如何列出引用SQL Server中给定表的所有外键?

    我需要在SQL Server数据库中删除一个高度引用的表. 我如何获取要删除表需要删除的所有外键约束的列表? (与在Management Studio的GUI中单击相比,SQL的答案更好.) #1楼 ...

  4. SQL Sever 小技巧之解决外键约束(禁用、启用外键约束)

    SQL Sever 小技巧之解决外键约束(禁用.启用外键约束) 因为有外键约束的存在,在从表中,修改主表不存在的数据是不合法的;在主表中,删除从表中已存在的主表信息也是不合法的. 当然方法总比困难多, ...

  5. sql语句创建表的同时添加外键约束

    sql语句创建表的同时添加外键约束 题目 建立一个商店的数据库store,记录顾客及其购物情况,由下面三个表组成: 商品(商品号,商品名,单价,商品类别,供应商): 顾客(顾客号,姓名,住址): 订单 ...

  6. SQL 语句:不得使用外键与级联,一切外键概念必须在应用层解决

    阿里Java规范 [强制]不得使用外键与级联,一切外键概念必须在应用层解决. 说明:以学生和成绩的关系为例,学生表中的 student_id是主键,那么成绩表中的 student_id则为外键.如果更 ...

  7. mysql 命令行 外键_MySQL命令行MySql外键设置详解

    第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...

  8. mysql另外加外键约束怎么写_mysql外键约束怎么写

    mysql外键约束的写法:[[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1].外键约束是表的一个特殊字段,经常与主键约束一起使用. 在 CREATE TAB ...

  9. mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键

    多表外键下将普通的id主键更新为uuid主键 2019-05-20 02:45:37 来源: 晴天小雨 0 摘要:在多表外键影响和保证数据不删除的前提下,借助Flask-sqlalchemy插件及SQ ...

最新文章

  1. 关于安徽赛区推广校赛的实施办法
  2. 为 Neutron 准备物理基础设施(II) - 每天5分钟玩转 OpenStack(76)
  3. 冲突域、广播域的通俗讲解
  4. 嵌入式成长轨迹23 【Linux应用编程强化】【Linux下的C编程 下】【Linux GUI编程】...
  5. Windows10家庭版安装Docker Desktop(非Docker Toolbox)
  6. android 监听安装来源_Android编程监听APK安装与删除等过程的方法
  7. hibernate dialect 方言 sqlserver2000 的方言
  8. JAVA中的引用四种引用类型
  9. flux服务器推消息,服务端主动推送数据,除了 WebSocket 你还能想到啥?
  10. 论述计算机辅助设计技术主要包括的内容,计算机辅助设计复习思考题
  11. Kotlin 常用API汇总
  12. MATLAB利用小波分析提取周期
  13. sift算法搭建(上半部,五,求二阶三阶黑塞矩阵的逆程序对比,c#实现)
  14. SEPIC 单端初级电感转换器 稳压器 -- Zeta 转换器
  15. Android-Task execution finished ‘signingReport‘
  16. 战双帕弥什qq登录服务器未响应是什么意思,战双帕弥什渠道账号登录失败怎么办...
  17. 关于正手拉前冲弧圈球和加转弧圈球的几点领悟
  18. 教你辨别专利编号| 专利的专利号申请号公开号公告号
  19. 【ESP32_8266_WiFi (十一)】通过JSON实现物联网数据通讯
  20. Saas应用领域与行业前景

热门文章

  1. python单元测试工具
  2. 北京计算机在职研究生双证学校,北京哪些学校有双证在职研究生?
  3. opencv-python教程学习系列8-opencv图像算术运算
  4. element ui分页器
  5. php div 居中代码,Div内容居中效果如何实现
  6. 练习:两数相加(链表逆序存储求和数字)
  7. openCV python低通滤波方法汇总
  8. linux vim 怎么查找,linux下vim 查找命令
  9. 12星座个性陶瓷复古项链
  10. 数字图像处理Python语言实现-图像滤波-维纳滤波(Wiener Filter)