如何建立这样的主键外键关系

netying 2009-04-13 11:15:43
表1

id name


表2

id1 id2 otherfields

我想让表1的id作为主键表
表2的两个字段id1和id2作为从键,可是这样的关系是无法建立的,如何处理?
就是说id1和id2这两个字段都要以表1的id作为主键

并且表1做删除操作时,只要id1或id2有1个的值在表1中被删除,表2的这条记录也跟着级联删除
...全文
144 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ks_reny 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 htl258 的回复:]
作外键级联删除/
[/Quote]
不用觸發器,那就用外鍵級聯刪除吧.
netying 2009-04-13
  • 打赏
  • 举报
回复
楼上说的有理,也许我应该将表2拆成2个表
等不到来世 2009-04-13
  • 打赏
  • 举报
回复
主从关系比较畸形。

你应该按顺序考虑这几个问题:
1.我的表一定要这样设计吗?
2.insert时,表2的id1,id2是怎么处理的?
3.update时,主从字段是怎么处理的?用的是外键还是触发器?(应该没用外键)
4.delete时,用什么方案?最好和update用同一方案。
small_well 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 htl258 的回复:]
CREATE TABLE A004(ID INT PRIMARY KEY,NAME VARCHAR(20))

CREATE TABLE A003(ID1 INT REFERENCES A004(ID) ON DELETE CASCADE ON UPDATE CASCADE,ID2 INT REFERENCES A004(ID),AGE TINYINT)
[/Quote]
我想请问一下:这样的话,ID2的级联删除不行啊!
netying 2009-04-13
  • 打赏
  • 举报
回复
CREATE TABLE A004(ID INT PRIMARY KEY,NAME VARCHAR(20))

CREATE TABLE A003(ID1 INT REFERENCES A004(ID) ON DELETE CASCADE ON UPDATE CASCADE,ID2 INT REFERENCES A004(ID),AGE TINYINT)


这样的话,id2是不能够级联删除的啊.
  • 打赏
  • 举报
回复
你级联更新和级联删除设置一个。

建议还是使用触发器来实现吧。这样的话,你自己还能控制。一般级联更新还可以用用,但是级联删除的话就要小心了。
htl258_Tony 2009-04-13
  • 打赏
  • 举报
回复
级联更新删除只需绑定一个字段。
taoistong 2009-04-13
  • 打赏
  • 举报
回复



CREATE TABLE A001(ID INT PRIMARY KEY,NAME NVARCHAR(20))

CREATE TABLE A002(ID1 INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDATE CASCADE,ID2 INT
,AGE TINYINT PRIMARY KEY(ID1,ID2))





表2 要有主键的啊
htl258_Tony 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 netying 的回复:]

CREATE TABLE A004(ID INT PRIMARY KEY,NAME VARCHAR(20))

CREATE TABLE A003(ID1 INT REFERENCES A004(ID) ON DELETE CASCADE ON UPDATE CASCADE,ID2 INT REFERENCES A004(ID) ON DELETE CASCADE ON UPDATE CASCADE,AGE TINYINT)

我要的如上的语句,然而执行,出错

服务器: 消息 1785,级别 16,状态 1,行 3
将 FOREIGN KEY 约束 'FK__A003__ID2__6C190EBB' 引入表 'A003' 中将导致循环或多重级联路径。请指定 O…
[/Quote]

CREATE TABLE A004(ID INT PRIMARY KEY,NAME VARCHAR(20)) 

CREATE TABLE A003(ID1 INT REFERENCES A004(ID) ON DELETE CASCADE ON UPDATE CASCADE,ID2 INT REFERENCES A004(ID),AGE TINYINT)
这样就可以了。
netying 2009-04-13
  • 打赏
  • 举报
回复
做两个外键就出错了
netying 2009-04-13
  • 打赏
  • 举报
回复
我是需要有两个字段都指向这个id
zxkid 2009-04-13
  • 打赏
  • 举报
回复
做二个外键行不行?
id1和id2都定义成id的外键
LIHY70 2009-04-13
  • 打赏
  • 举报
回复
进来听听~
netying 2009-04-13
  • 打赏
  • 举报
回复

CREATE TABLE A004(ID INT PRIMARY KEY,NAME VARCHAR(20))

CREATE TABLE A003(ID1 INT REFERENCES A004(ID) ON DELETE CASCADE ON UPDATE CASCADE,ID2 INT REFERENCES A004(ID) ON DELETE CASCADE ON UPDATE CASCADE,AGE TINYINT)

我要的如上的语句,然而执行,出错

服务器: 消息 1785,级别 16,状态 1,行 3
将 FOREIGN KEY 约束 'FK__A003__ID2__6C190EBB' 引入表 'A003' 中将导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其它 FOREIGN KEY 约束。
服务器: 消息 1750,级别 16,状态 1,行 3
未能创建约束。请参阅前面的错误信息。
claro 2009-04-13
  • 打赏
  • 举报
回复
帮顶。
htl258_Tony 2009-04-13
  • 打赏
  • 举报
回复
CREATE TABLE A001(ID INT PRIMARY KEY,NAME VARCHAR(20)) 
insert a001 select 1,'a'
insert a001 select 2,'b'
CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDATE CASCADE,AGE TINYINT)
insert a002 select 1,10
insert a002 select 1,20

delete from a001 where id=1

select * from a001
/*
ID NAME
----------- --------------------
2 b

(1 行受影响)
*/

select * from a002
/*
ID AGE
----------- ----

(0 行受影响)
*/
drop table a001,a002
htl258_Tony 2009-04-13
  • 打赏
  • 举报
回复
SQL级联删除与级联更新使用格式: 

CREATE TABLE A001(ID INT PRIMARY KEY,NAME VARCHAR(20))

CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDATE CASCADE,AGE TINYINT)


htl258_Tony 2009-04-13
  • 打赏
  • 举报
回复
作外键级联删除/
netying 2009-04-13
  • 打赏
  • 举报
回复
我想用trigger可以实现,但是不想用
htl258_Tony 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 szx1999 的回复:]
主从关系比较畸形。

你应该按顺序考虑这几个问题:
1.我的表一定要这样设计吗?
2.insert时,表2的id1,id2是怎么处理的?
3.update时,主从字段是怎么处理的?用的是外键还是触发器?(应该没用外键)
4.delete时,用什么方案?最好和update用同一方案。
[/Quote]分析挺到位的。

34,590

社区成员

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

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