sql学习笔记(21)----------添加外键

最近在忙考试,比较烦!本人一见到考试就蒙圈了!完全大脑空白,不受控制,再加上变态监考老师,更别提有多痛苦了。还好,顺利完成了考试,抽出点空来学习一下MySQL和Oracle,发现点问题,好似很严重。

那么,我想问:  如果让你写SQL语句,添加外键,你会怎么写,如果这就是面试题,你该怎么写呢?

反正我是写不全,不能完全的写正确,平时我们都是是通过数据库的图形工具直接就可以操作主键和外键的设定,但是,如果动真格的去写一些SQL语句,似乎就很吃力了吧!所以我劝自己和读者,耐心点去写一些SQL语句,百利而无一害,也对你找工作有帮助,当然,代码还是要敲的,但是还是,实际的去实践一下,感觉效果还是不错的!

收!

正式的讲解一下外键的添加吧!

mysql添加外键

为已经添加好的数据表添加外键:

语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名);

例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id)

//FK_ID是外键的名称

/*

CREATE TABLE `tb_active` (

 `id` int(11) NOT NULL AUTO_INCREMENT,

 `title` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

 `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

 `user_id` int(11) NOT NULL,

 PRIMARY KEY (`id`),

 KEY `user_id` (`user_id`),

 KEY `user_id_2` (`user_id`),

 CONSTRAINT `FK_ID` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

*/

删除外键

语法: ALTER TABLE table-name DROP FOREIGN KEY key-id;

例:   ALTER TABLE `tb_active` DROP FOREIGN KEY `FK_ID`

自动键更新和删除:

外键可以保证新插入的记录的完整性,但是,如果在REFERENCES从句中已命名的表删除记录会怎么样?在使用同样的值作为外键的辅助表中会发生什么?

 

 很明显,那些记录也应该被删除,否则在数据库中就会有很多无意义的孤立记录,MYSQL可以通过向FOREIGN KEY...REFERENCES修饰符添加一个ONDELETE
或ON UPDATE子句简化任务,它告诉了数据库在这种情况如何处理孤立任务

 关键字     含义

 CASCADE    删除包含与已删除键值有参照关系的所有记录

 SET NULL   修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL的字段)

 RESTRICT   拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)

 NO ACTION  啥也不做

 请注意,通过ON UPDATE 和 ONDELETE规则,设置MYSQL能够实现自动操作时,如果键的关系没有设置好,可能会导致严重的数据破坏,

 例如:如果一系列的表通过外键关系和ONDELETE
CASCADE 规则连接时,任意一个主表的变化都会导致甚至只和原始删除有一些将要联系的记录在没有警告的情况被删除,所以,我们在操作之前还要检查这些规则的,操作之后还要再次检查.

添加外键

alter table locstock add foreign key locstock_ibfk2(stockid) references product(stockid)

locstock 为表名, locstock_ibfk2 为外键名 第一个括号里填写外键列名, product为表名,第二个括号里是写外键关联的列名

删除外键

alter table locstock drop foreign key locstock_ibfk2

查看表有哪些外键

show create table locstock

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) 

    REFERENCES tbl_name (index_col_name, ...) 

    [ONDELETE
{RESTRICT | CASCADE | SET NULL | NO ACTION}] 

    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}] 

         所有tables必须是InnoDB型 ,它们不能是临时表。

·         在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。

·         在引用表中,必须有一个索引,被引用的列以同样的顺序被列在其中作为第一列。

·         不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中, 这是因为对这些列的索引必须总是包含一个前缀长度。

·         如果CONSTRAINTsymbol 被给出,它在数据库里必须是唯一的。如果它没有被给出,InnoDB自动创建这个名字。

  

时间: 2025-01-31 07:44:13

sql学习笔记(21)----------添加外键的相关文章

SQL - 添加外键

不解释: ---先创建外键的column ALTER TABLE tblLicenses ADD ProductID int not null; ---添加外键 ALTER TABLE tblLicenses ADD FOREIGN KEY (ProductID) REFERENCES tblProducts(ID) ---先创建外键的column Alter Table tblActivationRecords Add LicenseID bigint not null; ---添加带名字的外

Navicat在MySQL中添加外键详细过程

Navicat在MySQL中添加外键详细过程   /** *@author blovedr *功能: Navicat在MySQL中添加外键 *日期: 2018年6月21日   22:42 *注释: 学习数据库MySQL的点点记录, 谢谢网上各位大神分享经验,欢迎各位大神批评指导与交流. */   1. 打开Navicat连接上数据库, 并建立新的数据库:"test": 2. 在数据库"test"中创建两个表"emp"(主表)和"dept

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键

PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键 1. 附加:工具栏不见了 调色板(Palette)快捷工具栏不见了PowerDesigner 快捷工具栏 palette 不见了,怎么重新打开,找回来呢 上网搜索了一下"powerdesigner 图形工具栏",找到了找回PowerDesigner工具栏palette的方法Tools(工具栏)customsize toolbars(自定义工具栏)palette(调色板)勾选 2.

python基础教程_学习笔记21:文件和素材

文件和素材 打开文件 open函数用来打开文件,语法如下: open([name[,mode[,buffering]]) open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象.模式(mode)和缓冲(buffering)参数都是可选的. >>> f=open(r'D:\software(x86)\Python27\README.txt') 如果文件不存在,则出现错误: >>> f=open(r'D:\software(x86)\Python27\READM

mysql为表添加外键完成性约束 报错Can't create table 'sfkbbs.#sql-513_25' (errno: 150)

代码 alter table sfk_son_module add constraint foreign key(father_module_id) references sfk_father_module(id) on delete restrict on update restrict; (constraint 后面可以加上约束名字) 错误原因是之前两张表的id的类型不一样,一个时int,一个时bigint 解决办法时修改表, alter table sfk_father_module mo

SQL Server和MySQL主外键写法对比

SQL Server主键的写法: --列级 create table dept ( dept_no int primary key, dept_name nvarchar(20) not null ) --表级 create table dept ( dept_no int not null, dept_name nvarchar(20) not null, primary key (dept_no) ) --修改 create table dept ( dept_no int not null

Mysql添加外键约束

简单说一下使用外键的好处 1.完整性约束 比如:用户表中有字段 用户编号(id) , 名称(username)设备表中有字段 设备编号(id) , 设备名称(devicename) 设备属于的用户编号(user_id) 把设备表中的用户编号设置成外键,引用用户表的主键. 当向设备表中输入数据时,如果输入用户编号在用户表中找不到对应的话,就会报错,从而能保证这个设备必定会属于一个存在的用户. 2.可以实现级联删除 还引用上面的例子,当一个用户不在使用该系统时,需要将用户和他的设备从数据库删除,如果

mysq添加外键报错:check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=InnoDB' at line 1

今天用navcat往一个表添加外键的时候报错: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=InnoDB' at line 1 排查之后发现是因为两个表的类型不一样所致: SQL:SHOW TABLE STATUS 查询出数据表的状态,Engine那一列就是 使用