创建外键约束时提示主表的列与现存主键或Unique约束不匹配。

最后一只恐龙 2010-05-19 05:17:08
表A为主表,主键为a,b两个字段。
表B为外键表,主键为c,d,e两个字段。
现在要建立(c,d)参照(a,b)取值的外键约束,它们的数据类型完全一样,都是int,为什么出现如题的提示?
...全文
639 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
htl258_Tony 2010-05-19
  • 打赏
  • 举报
回复
--> 生成测试数据表: [a]
IF OBJECT_ID('[a]') IS NOT NULL
DROP TABLE [a]
GO
CREATE TABLE [a] ([a] [int],[b] [int],primary key(a,b))
INSERT INTO [a]
SELECT '1','2'

--> 生成测试数据表: [b]
IF OBJECT_ID('[b]') IS NOT NULL
DROP TABLE [b]
GO
CREATE TABLE [b] ([c] [int],[d] [int],[e] [int],foreign key(d,c) references a(a,b))
INSERT INTO [b]
SELECT '2','1','3'


-->SQL查询如下:

SELECT * FROM [a]
SELECT * FROM [b]
/*
a b
----------- -----------
1 2

(1 行受影响)

c d e
----------- ----------- -----------
2 1 3

(1 行受影响)

*/
这跟参照的位置有关系。
htl258_Tony 2010-05-19
  • 打赏
  • 举报
回复
--> 生成测试数据表: [a]
IF OBJECT_ID('[a]') IS NOT NULL
DROP TABLE [a]
GO
CREATE TABLE [a] ([a] [int],[b] [int],primary key(a,b))
INSERT INTO [a]
SELECT '1','2'

--> 生成测试数据表: [b]
IF OBJECT_ID('[b]') IS NOT NULL
DROP TABLE [b]
GO
CREATE TABLE [b] ([c] [int],[d] [int],[e] [int],foreign key(c,d) references a(a,b))
INSERT INTO [b]
SELECT '1','2','3'


-->SQL查询如下:

SELECT * FROM [a]
SELECT * FROM [b]
/*
a b
----------- -----------
1 2

(1 行受影响)

c d e
----------- ----------- -----------
1 2 3

(1 行受影响)

*/
htl258_Tony 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ivy_zheng 的回复:]
为什么(c,d)参照(a,b)不可以,而(d,c)参照(b,a)就可以了呢?就因为a有重复?但b也有重复啊,它们两个合起来才不重复
[/Quote]为什么(c,d)参照(a,b)不可以,而(d,c)参照(b,a)就可以了呢?
这不是一样吗
最后一只恐龙 2010-05-19
  • 打赏
  • 举报
回复
为什么(c,d)参照(a,b)不可以,而(d,c)参照(b,a)就可以了呢?就因为a有重复?但b也有重复啊,它们两个合起来才不重复
永生天地 2010-05-19
  • 打赏
  • 举报
回复

CREATE TABLE dbo.a
(
a int NOT NULL,
b int NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.a ADD CONSTRAINT
PK_a_1_1 PRIMARY KEY CLUSTERED
(
a,
b
) ON [PRIMARY]

GO



CREATE TABLE dbo.b
(
c int NOT NULL,
d int NOT NULL,
e int NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.b ADD CONSTRAINT
PK_b_1_1 PRIMARY KEY CLUSTERED
(
c,
d,
e
) ON [PRIMARY]

GO

GO
ALTER TABLE dbo.b ADD CONSTRAINT
FK_a_b FOREIGN KEY
(
c,
d
) REFERENCES dbo.a
(
a,
b
) ON UPDATE NO ACTION
ON DELETE NO ACTION

GO

--drop table a
--drop table b


参考
幸运的意外 2010-05-19
  • 打赏
  • 举报
回复
约束关联列的数据不满足各个约束的规则。看看关键表的字段是不是符合规则吧。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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