oracle为表建立外键时没有命名FOREIGN KEY约束,现在想删外键怎么办??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle为表建立外键时没有命名FOREIGN KEY约束,现在想删外键怎么办??相关的知识,希望对你有一定的参考价值。
为表Orders添加外键,ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P),现在想删除外键,但是当初没有命名FOREIGN KEY 约束,现在如何删除外键!!
alter table Orders drop foreign key Id_P;
会有错误提示信息,提示信息里有系统提供的外键约束名字,
然后根据系统提供的外键约束名字来删除就可以了。 参考技术A SELECT
USER_CONS_COLUMNS.CONSTRAINT_NAME AS 约束名,
USER_CONS_COLUMNS.TABLE_NAME AS 子表名,
USER_CONS_COLUMNS.COLUMN_NAME AS 子表列名,
USER_CONS_COLUMNS.POSITION AS 位置,
USER_INDEXES.TABLE_NAME AS 主表名,
USER_IND_COLUMNS.COLUMN_NAME AS 主表列名
FROM
USER_CONSTRAINTS
JOIN USER_CONS_COLUMNS
ON (USER_CONSTRAINTS.CONSTRAINT_NAME
= USER_CONS_COLUMNS.CONSTRAINT_NAME)
JOIN USER_INDEXES
ON (USER_CONSTRAINTS.R_CONSTRAINT_NAME
= USER_INDEXES.INDEX_NAME)
JOIN USER_IND_COLUMNS
ON (USER_INDEXES.INDEX_NAME = USER_IND_COLUMNS.INDEX_NAME)
WHERE
CONSTRAINT_TYPE = 'R';
用上面句子查一下,然后用下面语句删掉
ALTER TABLE 表名 DROP CONSTRAINT 外键约束名字; 参考技术B 不用删除表,数据库会自动命名,名字可能是sys_XXXXXX,这个能找到。如果有plsql那么可以通过plsql的一个功能直接查到建表语句,这里就有名字。要么可以通过相关视图根据字段查到。视图是user_constraints或者dba_constraints,里面的字段记不清楚了,自己查查吧。 参考技术C 直接删好了。追问
如何直接删??
参考技术D 直接用show create table 表名;查出约束名,然后删除用 alter table 表名 drop foreign key 约束名;
MySQL添加外键Foreign Keys出错,报错[HY000][3780]
今天写开发文档的时候需要做一下数据结构相关的内容,于是就想着一个快捷一点儿的操作,直接在DataGrip里面调用视图,然后将视图打印为PDF,这样就可以直接截图获取到图片了。由于开发的过程中也没有怎么注重外键的建立,因为本来就是一个小小的比赛,所以生成视图的时候外键联系的箭头都没有,真的是自闭了,如果这个直接给评委看,评委估计会气哭。。。所以我打算花点时间加一些外键上去,心里想着也花不了多少时间,谁知道,这下子还遇到一些哲学问题!
首先看下,本来数据库表视图是这样的,我只是想多增加一些外键约束,让它看起来更加的专业一点儿,而不是一个像小学生做的数据库似的。
接下来设置外键的过程(park_detail中的scenic_id是外键,scenic_info中的scenic_id是主键)就很牛逼了,直接就遇到了这样的提示:
[HY000][3780] Referencing column ‘scenic_id‘ and referenced column ‘scenic_id‘ in foreign key constraint ‘park_detail_scenic_info_scenic_id_fk‘ are incompatible.
这个问题出现的时候,我发动我四级英文阅读能力(好吧其实六级也过了,只是六级擦边。。),可以看出MySQL提示外键与引用的列不兼容。我想的是可能park_detail中的scenic_id没有带有非空约束,而scenic_info中的scenic_id是肯定有非空约束的,所以聪明的我又去查看了它们两个数据项的约束条件是否一致。
下面两幅图分别是这两个数据项的约束条件,可以看出都是设置了非空约束,但就是不能成功的设置外键,我已经抓狂了快。
我直接把整个错误copy到百度,看到有人说有可能是字符集的问题,这句话点醒了我,所以我用MySQL的mysqldump工具把这两个表导出到了桌面
然后去观察这两个sql文件内是怎么对字符集编码进行规定的
可以看出来,这两个表内的字符集规定并不是完全一样,那么接下来就以scenic_info这个表作为基准,去更改park_detail的字符集问题。
ALTER TABLE park_detail CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
上面的代码是更改的表结构的编码,也可以自己写代码直接更改字段的编码,不过我还没有试,此类更改字符集的教程也是比较的多。
列举几个比较常用的:
修改已存在列的collate属性,需要使用下面的语法
alter table tbl_name MODIFY col_name column_definition CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name
修改表的默认字符集
ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE…];
把表的默认字符集和所有的字符列都更改为新的字符集
ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
修改字段的字符集
ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE …];
如果创建数据库的时候没有进行指定,以系统自己的字符设置为准,这里说的系统是运行的MySQL,估计是因为我的电脑重装了,导致前后两次备份的数据库内字符集就变混乱了,不过现在掌握了怎么更改字符集,还怕什么?下面就是我更改成功之后,添加了外键的效果
不一定只有系统遇到外键错误时才会报错[HY000][3780],有可能同样是因为字符集不一样的问题报这个错误。
以上是关于oracle为表建立外键时没有命名FOREIGN KEY约束,现在想删外键怎么办??的主要内容,如果未能解决你的问题,请参考以下文章
数据库添加外键错误:[Err] 1215 - Cannot add foreign key constraint 的解决
MySQL添加外键Foreign Keys出错,报错[HY000][3780]
Navicat For MySQL--外键建立与cannot add foreign key constraint分析
Mysql使用Navicat建立外键时报错cannot add foreign key constraint分析
FOREIGN KEY 外键约束; UNIQUE和PRIMARY KEY 主键约束CREATE INDEX建立索引的使用