可以忽视关联的情况下:
先取消主外键关系验证:SET FOREIGN_KEY_CHECKS = 0;
然后删除需要删除的数据:truncate table table_name;
最后恢复:SET FOREIGN_KEY_CHECKS = 1;
mysql清表时有外键关联处理办法
标签:tab trunc png 外键 UNC mys mic image nbsp
小编还为您整理了以下内容,可能对您也有帮助:
MySQL 如何删除有外键约束的表数据
在MySQL中删除一张表或一条数据的时候,出现
[Err] 1451 -Cannot deleteorupdatea parent row:
aforeignkeyconstraintfails (...)
这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。
禁用外键约束,我们可以使用:
SETFOREIGN_KEY_CHECKS=0;
然后再删除数据
启动外键约束,我们可以使用:
SETFOREIGN_KEY_CHECKS=1;
查看当前FOREIGN_KEY_CHECKS的值,可用如下命令:
SELECT @@FOREIGN_KEY_CHECKS;
MySQL 如何删除有外键约束的表数据
在MySQL中删除一张表或一条数据的时候,出现
[Err] 1451 -Cannot deleteorupdatea parent row:
aforeignkeyconstraintfails (...)
这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。
禁用外键约束,我们可以使用:
SETFOREIGN_KEY_CHECKS=0;
然后再删除数据
启动外键约束,我们可以使用:
SETFOREIGN_KEY_CHECKS=1;
查看当前FOREIGN_KEY_CHECKS的值,可用如下命令:
SELECT @@FOREIGN_KEY_CHECKS;
mysql有外键约束的表无法联级删除?
看看外键的 级联 选项, 是CASCADE 的 才可以级联删除:
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION 外键的使用需要满足下列的条件:
InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:
1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。
2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
3. NO ACTION: InnoDB拒绝删除或者更新父表。
4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
5. SET DEFAULT: InnoDB目前不支持。
mysql外键问题
默认建表关系时:
如果把A表的id列设成主键,B表id列与A表id是主外键关系的话,那么你无法直接删除A表的记录,必须先删除与A表id列有关联的B表中的数据后,才能删除A表数据,这是主外键约束。
特殊情况时:
可以调整主外键的删除规则,设置 删除规则 为:Cascade
这样就可以进行级联删除了,删除主表数据时,外表数据同时被删掉。
PS:这种设置很危险,一般情况下为了保证数据的完整性,都避免使用这样的表设计。
mysql外键问题
默认建表关系时:
如果把A表的id列设成主键,B表id列与A表id是主外键关系的话,那么你无法直接删除A表的记录,必须先删除与A表id列有关联的B表中的数据后,才能删除A表数据,这是主外键约束。
特殊情况时:
可以调整主外键的删除规则,设置 删除规则 为:Cascade
这样就可以进行级联删除了,删除主表数据时,外表数据同时被删掉。
PS:这种设置很危险,一般情况下为了保证数据的完整性,都避免使用这样的表设计。
在mysql中,表的字段是本表的外键,这该如何设置?
1. 打开我的navicat,然后找到我的teacher表,选中它,然后点击菜单的‘design table’。
2. 在弹出的对话框中找到“Foreign Keys”,然后单击。
3. 然后会出现一个设置外键的界面,一共有七列。简单介绍一下这几列的意思。
‘name’:可以不填,你一会保存成功系统会自动生成。
‘FieldName’:就是你要把哪个键设置为外键。这里选择‘dept’
‘Reference DadaBase’:外键关联的数据库。
‘Reference Table‘ :关联的表 这里是dept表
‘Forgin filed Names’:关联的的字段,这里是code
‘ondelete’:就是删除的时候选择的动作。这里我的选择是setNull,意思就是当关联的表删除以后,teacher》dept字段会设置为null。
‘onupdate’:就是更新的时候选择的动作。这里我的选择是CASCADE,意思就是当关联的表更新以后,teacher》dept字段会设置为级联更新。
4. 设置完成后点击‘save’保存退出,也可以点击‘add Foreign Key’再添加一个外键。
MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权(本词条“授权”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
mysql表有外键必须要删掉外键才能删掉表吗
是的,所以要先删除外键。
mysql表有外键必须要删掉外键才能删掉表吗
是的,所以要先删除外键。
关于MYSQL创建主外键关联,1-4问题
有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。
1. check table 和 repair table
登陆mysql 终端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
repair table tabTest;
进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:
myisamchk tablename.MYI
进行检测,如果需要修复的话,可以使用:
myisamchk -of tablename.MYI
关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
-----------------------------
另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前:
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。
需要注意的时,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!检测修复所有数据库(表)追问这个太复杂了。可不可以直接写语句谢谢!这个是二级考试题目
关于MYSQL创建主外键关联,1-4问题
有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。
1. check table 和 repair table
登陆mysql 终端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
repair table tabTest;
进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:
myisamchk tablename.MYI
进行检测,如果需要修复的话,可以使用:
myisamchk -of tablename.MYI
关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
-----------------------------
另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前:
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。
需要注意的时,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!检测修复所有数据库(表)追问这个太复杂了。可不可以直接写语句谢谢!这个是二级考试题目
mysql为什么被设了外键的表还能被删掉?
当某表被外键约束关联时,InnoDB不允许你删除该表,除非你执行了SET foreign_key_checks = 0命令。当LOAD DATA和ALTER TABLE操作时设置foreign_key_checks为0是很有用的,可以避免外键检查提高效率。
foreign_key_checks从MySQL 3.23.52 and 4.0.3开始时可用的。
查看当前FOREIGN_KEY_CHECKS的值可用如下命令
SELECT @@FOREIGN_KEY_CHECKS;
禁用外键约束: SET FOREIGN_KEY_CHECKS=0;
启动外键约束: SET FOREIGN_KEY_CHECKS=1;
其他参考:
http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-constraints.html
MySQL之外键约束:
http://blog.csdn.net/cnjsnt_s/article/details/5548280
mysql为什么被设了外键的表还能被删掉?
当某表被外键约束关联时,InnoDB不允许你删除该表,除非你执行了SET foreign_key_checks = 0命令。当LOAD DATA和ALTER TABLE操作时设置foreign_key_checks为0是很有用的,可以避免外键检查提高效率。
foreign_key_checks从MySQL 3.23.52 and 4.0.3开始时可用的。
查看当前FOREIGN_KEY_CHECKS的值可用如下命令
SELECT @@FOREIGN_KEY_CHECKS;
禁用外键约束: SET FOREIGN_KEY_CHECKS=0;
启动外键约束: SET FOREIGN_KEY_CHECKS=1;
其他参考:
http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-constraints.html
MySQL之外键约束:
http://blog.csdn.net/cnjsnt_s/article/details/5548280
mysql数据库表之间是怎么关联的?请详解
left join
join
主外键是两种对表的约束。
例如:
学生表student(学号(id),姓名(name),性别(sex))
表内有:1,aa,女
课程表subject(课程编号(id),课程名(name))
表内有:1,语文
成绩表grade(成绩编号(id),学号(stu_id),课程号(sub_id),成绩(grade))
表内有:1,1,1,90
成绩表的学号就是学生表的学号相对应,并且为学生表的主键,这样就称成绩表中的学号是学生表的外键,同理,成绩表中的课程号是课程表的外键。
select * from student as s inner join subject as su on su.stu_id=s.id inner join grade as g on g.sub_id=su.id where 1.
注意事项
SQL 连接(JOIN) 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。
左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。
假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。
不同的 SQL JOIN可以使用的不同的 SQL JOIN 类型:
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行(MySQL不支持FULL JOIN)
例如:
mysql> select * from access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date |
+-----+---------+-------+------------+
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set
mysql数据库,我想删除一张表,这张表的主键又作为其它多张表的外键,InnoDB,且设置了删除cascade。
这样的操作明显违法了当初如此进行这些表关系设计的初衷。
cascade用处在于,你删除某条记录时,如果主键值被删除,那么级联删除子表的相关数据。
不适用于你现在的情况:删除主表!!!
还是建议你想好,为什么要删除此表。
安全起见的话,先删除各个外键,再删除主表;建议删除主表前,先备份(以免后悔)