日期:2014-05-17  浏览次数:21369 次

如何在多个关联的表插入数据?
例如:
表1.user
字段:id, not null;
  name
  role, not null;

表2.role
字段:id, not null;
  name
  resc, not null;

表3.resc
字段:id, not null;
  name
  user,not null;

------解决方案--------------------
以前我这样用过,但是忘记了,帮你找了一下,希望对你有帮助
在以前的版本中,如果想插入多个表中,需要使用多条INSERT语句,9I开始可以用一条INSERT语句实现向多个表中插入数据.
INSERT [ALL] [conditional_insert_clause]
[insert_into_clause values_clause] (subquery)

其中conditional_insert_clause如下:
[ALL] [FIRST]
[WHEN condition THEN] [insert_into_clause values_clause]
[ELSE] [insert_into_clause values_clause]

上面的语法说明其实包含了两种情况
>无条件
>有条件,所以后面的conditional_insert_clasue里出现的[ALL]和INSERT后面的[ALL]是分属两种情形下的
举例就很容易理解了


无条件INSERT ALL
INSERT ALL
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID,hire_date HIREDATE,salary SAL,manager_id MGR
FROM employees
WHERE employee_id>200;
因为没有附加限制于检索出的记录,所以所有检索返回数据讲根据其列名插入相应的表中.

有条件的INSERT ALL
INSERT ALL
WHEN SAL>10000 THEN
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
WHEN MGR>200 THEN
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID,hire_date HIREDATE,salary SAL,manager_id MGR
FROM employees
WHERE employee_id>200;
这里就将比较了,返回记录将比较其SAL,如果大于10000则插入SAL_HISTORY,同理,MGR大于200的记录将插入MGR_HISTORY表.其余都将丢弃.

有条件的FIRST INSERT
FIRST与ALL的区别在于当遇到第一个求值为TRUE的子句之后停止对WHEN子句求值,而ALL不论是否求值为TRUE.
INSERT FIRST
WHEN SAL>25000 THEN
INTO special_sal VALUES(DEPTID,SAL)
WHEN HIREDATE like ('%00%') THEN
INTO hiredate_history_00 VALUES(DEPTID,HIREDATE)
WHEN HIREDATE like ('%99%') THEN
INTO hiredate_history_99 VALUES(DEPTID,HIREDATE)
ELSE
INTO hiredate_history VALUES(DEPTID,HIREDATE)
SELECT department_id DEPTID,SUM(salary) SAL,
MAX(hire_date) HIREDATE
FROM employees
GROUP BY department_id;
上例中如果第一个WHEN子句求值为TRUE则其后的WHEN子句将不会被执行,反之将直到遇到第一个满足条件的子句执行为止.


------解决方案--------------------
SQL code

not null列的必须提供数据
primary key和unique列的必须提供唯一值
下面说说参照约束的,既外键约束:
1.你可以先在被参照的表中添加数据,再向参照表添加数据
2.你可以将外键约束延迟,到提交时才验证参照约束。
  在相关约束后面加上 DEFERRABLE INITIALLY DEFERRED