如何主外键约束关系的两个表中插入数据

cyliyang 2010-11-20 02:30:23
oracle数据库中有建立主外键关系的两张表,主表和明细表,例如订单和订单明细
主表: OrderID 主键
其它字段略
明细表: OrderID:外键
其它字段图

现在要向表中插入数据,主表中1条,明细表中5条。
向明细表中插数据时,提示违反主外键约束,
在用事务处理 时 该怎么写 Sql 语句呢 ?

请教各位帮忙解决一下 !!!!
...全文
1248 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyliyang 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 krad_d 的回复:]
你主表中应该有自增长的唯一标识吧!
那么你在主表插入的语句中加入select @@identity 获得最新自增长的ID
这iD就是明细表的外键了
[/Quote]

多谢提醒 这个读取解决了 oracle中的 是自增序列 sequence 读取当前的CURRVAL 值 是当前插入记录 的号。 不过该怎么保证与明细表中后插入相关联数据10条匹配一致呢 ?也就是在多线操作时 会不会是读取的这个号 可能就是别人刚刚插入的值了 该怎么处理多线是这样的问题呢 ?多线时 加锁处理该怎么实现呢?
浪子-无悔 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 krad_d 的回复:]

你主表中应该有自增长的唯一标识吧!
那么你在主表插入的语句中加入select @@identity 获得最新自增长的ID
这iD就是明细表的外键了
[/Quote]
在存数过程中试可以这么操作,但是不知道楼主到底是插入语句用存储过程实现还是想利用后台代码实现
呵呵
浪子-无悔 2010-11-20
  • 打赏
  • 举报
回复
很简单哈。
如果你主表的ID是自动增长的话 我觉得不是一个很好的解决方法,毕竟自动增长在程序里面不好控制。
比方你 获取最大记录数+1 万一你有删除的数据呢,这样不准确。
采用 COUNT 的方法更不合适。
建议采用.NET 自带方法 GUID 生成主表的ID 然后用一个变量保存起来。
明细表插入数据的时候不就可以引用主表的ID 了 然后就循环SQL语句 呗。试下。
Krad_D 2010-11-20
  • 打赏
  • 举报
回复
你主表中应该有自增长的唯一标识吧!
那么你在主表插入的语句中加入select @@identity 获得最新自增长的ID
这iD就是明细表的外键了
cyliyang 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gac520 的回复:]

有这个外键约束的话,你的明细表的ORDERID 这个字段在主表里必须有改记录才可以哈
事物:无碍乎就是你执行的语句 必须完全成功执行 提交,只要有一条无法执行将全部回滚。
[/Quote]

我同时 向 这两个表中插入一组记录 主表中一条 明细表中 5 条 该怎么写这个 语句呢?
cyliyang 2010-11-20
  • 打赏
  • 举报
回复
恩 在主表中 ID 是自动增长序列 我在向主表中 插入一条后 再怎么写 向明细表中 插入5条记录的语句呢 (明细表中外键非空 怎么获取得到 要插入的与主表中相匹配关联的ID 号?)
浪子-无悔 2010-11-20
  • 打赏
  • 举报
回复
有这个外键约束的话,你的明细表的ORDERID 这个字段在主表里必须有改记录才可以哈
事物:无碍乎就是你执行的语句 必须完全成功执行 提交,只要有一条无法执行将全部回滚。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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