使用Oracle中的约束将数据从一个表复制到另一个表

时间:2013-11-13 21:41:48

标签: sql oracle sql-update

我在Oracle中有两个表,定义如下:

位置数据

loc_id
capacity
loc_type

用户数据

loc_id
custom001

如果满足以下约束条件,我想要做的是将location.capacity中的内容复制到user.custom001中:

custom001<>容量

loc_type IN('A','B')

容量不是NULL或0

基于我在Stack Exchange上发现的其他一些查询,我开发了这个:

UPDATE user u 
SET u.custom001 = 
  (SELECT l.capacity
  FROM location l
  WHERE u.loc_id = l.loc_id
  AND l.capacity <> u.custom001
  AND l.loc_type IN ('110','210')
  AND l.capacity IS NOT NULL 
  AND l.capacity <> 0)
WHERE exists (select capacity from location l WHERE l.loc_id = u.loc_id)

但它并不尊重约束,并且正在更新用户表中的大多数行,其中大多数都是NULL。

我需要从哪里离开?

2 个答案:

答案 0 :(得分:1)

你很亲密 以下应该有效:

UPDATE user u 
SET u.custom001 = (
  SELECT l.capacity
  FROM location l
  WHERE u.loc_id = l.loc_id
) where exists (
  select null from location l 
  WHERE l.loc_id = u.loc_id
  AND l.capacity <> u.custom001
  AND l.loc_type IN ('110','210')
  AND l.capacity IS NOT NULL 
  AND l.capacity <> 0
)

您所拥有的基本问题是您正在应用所有限制,但是由于WHERE exists条款中不存在的限制而无论如何都要更新所有内容

答案 1 :(得分:0)

我使用这个approch并且适合我。您可以使用sql Developer生成表的ddl。然后,您可以创建具有约束的新表,例如主键,非空约束和生成的ddl中的外键。如果你的表只是没有null约束使用 将表new_table创建为(select * from old_table);