外键问题

名纯 2017-06-05 11:03:21
我通过sql语句:CREATE table Orders
(Id_O int not null primary key,
Orderno int not null,
Id_P int foreign key references persons(Id_P)
)
创建了orders表,给id_p列添加了外键关联到persons表的id_p列,

然后我再通过sql语句:alter table orders
drop constraint fk_perorders
(注意,这条语句是我在学习sqlserver过程中直接按照网上教程打的)
企图撤销orders表的外键,但是出现以下错误:

服务器: 消息 3728,级别 16,状态 1,行 1
'fk_perorders' 不是约束。
服务器: 消息 3727,级别 16,状态 1,行 1
未能除去约束。请参阅前面的错误信息。

现在问:上面通过sql语句创建表外键的时候好像并没有声明外键名,那么这个外键名是否有默认名字?如果有,那是什么?
再问:以上问题如果问错了,请各路大神解惑一二,还有出错的原因也请明示~~~我是个初学者,非常期待收到到你们给我的建议和指教
...全文
170 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
名纯 2017-06-06
  • 打赏
  • 举报
回复
引用 2 楼 baidu_36457652 的回复:
你这个定义外键 语句好像不对啊。
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)

看到你的回复我又去看了一遍sql语句,如图所示,定义外键的方法是不是有两种?一种是没名字的外键定义方法,一种是有名字的外键定义方法?
还有,这图里的第二种定义外键的方法我不理解,他说如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用这个方法,那么我看不出他对多个列定义了外键???貌似只对id_p定义了外键?其区别仅仅是跟上面的定义外键的方法多了个名字?另外我有一个猜测,这第二种方法上面的sql语句提到:PRIMARY KEY (Id_O),这个是定义id_o是主键的吧?那么这也算是定义“键”,所以加上下面的就可以说成是定义“多个”键的约束?
名纯 2017-06-06
  • 打赏
  • 举报
回复
引用 2 楼 baidu_36457652 的回复:
你这个定义外键 语句好像不对啊。
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)

但是他实现了啊,我在表上面验证了确实有效果,而且我在学的网站上面是这么教的,你看截图它在定义单个外键并没有为这个动作或者这个改动定义一个名字,就像你给的sql语句那样定义一个叫fk_PerOrders的名字
Tiger_Zhao 2017-06-06
  • 打赏
  • 举报
回复
手边没有 SQL Server 2000,不确定从哪个界面可以看到外键定义。通常应该是在表的设计中。
实在不行,你可以用数据库的生成SQL定义的功能,注意生成选项中选中外键。最后看SQL文件就行。

又:各种主键、外键之类应该用#2的方式单独一行定义;直接在字段后上限定,自动生成的命名不确定,不方便后期修改。
名纯 2017-06-06
  • 打赏
  • 举报
回复
引用 10 楼 Tiger_Zhao 的回复:
[Quote=引用 6 楼 qq_34771906 的回复:]也就是说,没有给这种行为定义一个名字的sql语句是不合适的,不规范的,属于邪门歪道?但是缺又被sqlserver2000承认并且执行了?[/Quote] SQL-92 标准语法中 FOREIGN KEY 只是字段的一个约束,不能单独删除、只能删除字段。 可以单独定义/删除的语法是 SQL Server 扩充的。
谢谢,学到了很多
名纯 2017-06-06
  • 打赏
  • 举报
回复

此贴终结,感谢楼上的兄弟替我找出问题的关键,此问题纠结我2天,我也是非常的头疼,现在解决了一身轻松,真的很爽。解决方法是找出正确的外键名,如楼上所说,在sql查询分析器中按F8在左侧出现的对象浏览器中可以看到此默认外键的完整名字,如果还有兄弟遇到类似的问题,如果不会打这个外键名,也可以在设计表上右键有外键的列上打开属性对话框,如图:

在关系一项中可以复制这个关系名,这个关系名就是默认的外键名。那条下横行其实是两条“_”打出来的。在sql语句上可能会有间隙,但是在这里是没有的,粗心的朋友要注意了。
Tiger_Zhao 2017-06-06
  • 打赏
  • 举报
回复
左边树中不是又全名了啊!
名纯 2017-06-06
  • 打赏
  • 举报
回复
随着我学习了更多的约束语句,我发现不仅仅外键约束如此,所有的约束,都可以通过不定义约束名就可以创建?在撤销的时候又要通过指定约束名来撤销约束?这是为什么?

引用 9 楼 Tiger_Zhao 的回复:
[Quote=引用 7 楼 qq_34771906 的回复:]还有,你的sqlserver版本是什么,你可以通过什么方式来获得外键信息呢?[/Quote]
找了个虚拟机中的 SQL Server 2000 试了试。
要用查询分析器(isqlw.exe)而不是企业管理器。
查询分析器左侧的目录树(F8)展开来,可以在表下的约束中看到主键、外键。
谢谢你!真的,非常感谢!!!!!这个问题一直纠结了我两天,从我发帖到现在,真的非常感谢!!!
只是我又出现了新的问题,我通过sql语句还是撤销不了这个外键约束,也就是说我不知道填什么外键名才是对的才能执行成功撤销掉这个外键约束,如图:
Tiger_Zhao 2017-06-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qq_34771906 的回复:]也就是说,没有给这种行为定义一个名字的sql语句是不合适的,不规范的,属于邪门歪道?但是缺又被sqlserver2000承认并且执行了?[/Quote]
SQL-92 标准语法中 FOREIGN KEY 只是字段的一个约束,不能单独删除、只能删除字段。
可以单独定义/删除的语法是 SQL Server 扩充的。
Tiger_Zhao 2017-06-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq_34771906 的回复:]还有,你的sqlserver版本是什么,你可以通过什么方式来获得外键信息呢?[/Quote]
找了个虚拟机中的 SQL Server 2000 试了试。
要用查询分析器(isqlw.exe)而不是企业管理器。
查询分析器左侧的目录树(F8)展开来,可以在表下的约束中看到主键、外键。
名纯 2017-06-06
  • 打赏
  • 举报
回复
就算没有能够解答我疑惑的大神,难道解决我出错的方法都没有么····各种求回复啊
名纯 2017-06-06
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
手边没有 SQL Server 2000,不确定从哪个界面可以看到外键定义。通常应该是在表的设计中。 实在不行,你可以用数据库的生成SQL定义的功能,注意生成选项中选中外键。最后看SQL文件就行。 又:各种主键、外键之类应该用#2的方式单独一行定义;直接在字段后上限定,自动生成的命名不确定,不方便后期修改。
还有,你的sqlserver版本是什么,你可以通过什么方式来获得外键信息呢?
名纯 2017-06-06
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
手边没有 SQL Server 2000,不确定从哪个界面可以看到外键定义。通常应该是在表的设计中。 实在不行,你可以用数据库的生成SQL定义的功能,注意生成选项中选中外键。最后看SQL文件就行。 又:各种主键、外键之类应该用#2的方式单独一行定义;直接在字段后上限定,自动生成的命名不确定,不方便后期修改。
也就是说,没有给这种行为定义一个名字的sql语句是不合适的,不规范的,属于邪门歪道?但是缺又被sqlserver2000承认并且执行了?
  • 打赏
  • 举报
回复
你这个定义外键 语句好像不对啊。 CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
名纯 2017-06-05
  • 打赏
  • 举报
回复
另外,还有一问,我的sql版本是sqlerver2000,由于我是个初学者,甚至连问题的表达能力都成问题,忘各路大神见谅,请问我怎么查询我的外键?额类似于这样如图所示我通过右键orders表》所有任务》管理索引》看到的这个对话框从而知道我有一个主键,列是id_O,就像上面所说的,我怎么通过怎样的方法来知道一张表的外键信息···额大概就是这样吧···

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧