我有2张桌子
T_Foo
foo_id
fooHeader
T_FooBodys
foo_id
foobody
foo_id是两个表的主键。在第二个表中,foo_id是第一个表的外键。我使用一个序列生成两个表值的PK,并尝试插入 - 一次进入FooHeader,两次进入FooBody。
我的代码在第二次插入到T_FooBodys的循环中崩溃,错误为“ORA-00001:违反了唯一约束(USERID.FooBodys_PK)”
所以我有两个问题:
1)MSSQL Server和Oracle之间的根本区别是什么?这在SQL Server中运行良好!我一直有一对一/很多关系
2)除了添加另一个密钥并基本上结束共享主键概念之外,解决此问题的最简单方法是什么?
非常感谢
答案 0 :(得分:2)
foo_id是两者的主键 各自的表格
对于具有MS SQL Server或Oracle的PK,您不能有重复的条目,因此您在某处犯了错误。您可能已在SQL Server中设置了FK关系,但无法将foo_id
中的T_FooBodys
设置为PK,并且仍允许重复输入。
答案 1 :(得分:0)
如果foo_id是T_FooBodys表中的主键,则它必须是唯一的。听起来你希望foo_id成为T_FooBodys中的外键。我认为SQL Server具有相同的约束 - 主键必须是唯一的 - 这基本上是主键的定义。
您可以在Bodys表中添加新的PK吗?并将foo_id保留为Header表中的PK和Bodys表中的外键?
答案 2 :(得分:0)
我不相信它像您在MS SQL Server中描述的那样有效。如果您在T_FooBodys.foo_id
上有主键约束,那么您只能插入一个具有给定值的行。
要使T_FooBodys
接受给定值foo_id
的多行,您应添加另一列,并使用该新列在foo_id
上创建一个双列主键。这将允许您在第二列中具有不同的值,从而保留唯一性。
CREATE TABLE T_FooBodys (
foo_id INTEGER NOT NULL,
foo_body_id INTEGER NOT NULL,
foobody TEXT,
PRIMARY KEY (foo_id, foo_body_id),
FOREIGN KEY (foo_id) REFERENCES T_Foo (foo_id)
);
答案 3 :(得分:0)
为了回答给定的问题,我会说:
希望有所帮助
答案 4 :(得分:0)
您应该按以下方式更改表格T_FOOBODYS
:
/*Create table*/
create table T_FOOBODYS
(
FOOBODY_ID NUMBER(10) not null,
FOO_ID NUMBER(10) not null,
FOOBODY VARCHAR2(512)
);
/* Create/Recreate primary, unique and foreign key constraints */
alter table FOOBODY
add constraint FBPK primary key (FOOBODY_ID)
ENABLE;
alter table FOOBODY
add constraint FBFK foreign key (FOO_ID)
references T_FOO(FOO_ID);
此处,FOOBODY_ID
代表T_FOOBODYS
表的主键,FOO_ID
是T_FOO
的参考约束。
答案 5 :(得分:0)
RedFilter回答了为什么你收到错误的问题。我想知道为什么这两个表是分开的:它看起来像是一对一的关系,并且标题和正文都应该在主表中。不这样做的唯一原因是如果有性能考虑。