当前位置: 首页 > 面试题库 >

在具有循环引用的SQL中插入TABLES

太叔天宇
2023-03-14
问题内容

我有2张表:

Empleados(**numEmpl**, nombre, apellido, sexo, telefono, salario, numDept)
Departamentos(**numDept**, nombreDept, numDirect)

在部门中:

  1. numEmpl是主键
  2. numDept是对Departamentos(numDept)的外键引用。在部门中:
  3. numDept是主键
  4. numDirect是对Empleados(numEmpl)的外键引用

因此,有一个循环参考。

首先,我创建了表格:

CREATE TABLE EMPLEADOS(numEmpl primary key, nombre, 
     apellido, sexo, telefono, salario, numDept)
CREATE TABLE DEPARTAMENTOS(numDept primary key, nombreDept, numDirect)
(i didn't write here each of type is each colum)

现在,我在它们之间创建引用:

ALTER TABLE DEPARTAMENTOS 
    ADD CONSTRAINT FK_DEPT_EMP FOREIGN KEY (numDirect) 
    REFERENCES EMPLEADOS(numEmpl)
ALTER TABLE EMPLEADOS 
    ADD CONSTRAINT FK_EMP_DEPT FOREIGN KEY (numDept) 
    REFERENCES DEPARTAMENTOS(numDept).

它起作用了,所以现在我尝试插入一些数据:

INSERT INTO Empleados(numEmpl, nombre, apellidos, sexo, telefono, salario, numDept)
VALUES (1, 'Pepito', 'P茅rez', 'H', '111111111', 20000, 1);
INSERT INTO Departamentos(numDept, nombreDept, numDirect)
VALUES (1, 'Direccion', 1);

但是现在它引发了一个错误,告诉我不能在循环引用中引入数据,我试图禁用循环引用并插入数据,然后再次启用它,它起作用了,但是有人告诉我这不是正确的方法,在创建表以这种方式插入数据时我必须做一些特殊的事情,它会起作用,但是我不知道该怎么做。我正在使用oracle
sql developer。

编辑:感谢您的答案,但他们没有用。首先,我只能拥有该表,当我执行插入操作时,它必须以这种方式工作,而无需将参数设置为null并随后对其进行更新,很抱歉,我之前没有说过。因此,我要做的唯一方法就是允许圆参考,但是当我尝试以某人在这里所说的方式来做时,它告诉我一些有关回滚的信息,有人可以提供帮助吗?


问题答案:

要允许循环引用,您需要可延迟的约束:

ALTER TABLE DEPARTAMENTOS 
    ADD CONSTRAINT FK_DEPT_EMP FOREIGN KEY (numDirect) 
    REFERENCES EMPLEADOS(numEmpl)
    DEFERRABLE INITIALLY DEFERRED
    ;
ALTER TABLE EMPLEADOS 
    ADD CONSTRAINT FK_EMP_DEPT FOREIGN KEY (numDept) 
    REFERENCES DEPARTAMENTOS(numDept)
    DEFERRABLE INITIALLY DEFERRED
    ;

事务结束时 检查可延展性约束;在提交时间之前,允许存在虚假的 无效数据库状态
(在原始问题中:两个插入语句之间)。但是语句必须在事务内部,因此语句应包含在BEGIN [WORK];和中COMMIT [WORK];



 类似资料:
  • 问题内容: 我想每次插入带有日期+ 1的行。这是一个简单的SQL循环。我正在使用SSIS,因此StartDate和Enddate是变量。 这是我的代码: 错误信息: 消息156,级别15,状态1,行11关键字’select’附近的语法错误。 问题答案: 无需在声明。 代替 和

  • 问题内容: 我有下表: 存储在其中的实体是按层次结构组织的:如果存在一行,则认为该行是任何内容的“子项” 。由于项目不能从其自身衍生而来,因此我想将存在循环层次序列的行为定为非法: 我该怎么做呢? 另外,我可以在表中添加一个表示层次结构中“级别”的字段: 然后,我要求将其设置为when ,否则。 我正在使用SQL Server 2008 R2。 问题答案: 为了检查循环引用,我使用了触发器和递归C

  • 问题内容: 您使用哪种SQL技巧将数据输入到两个表之间,并在两个表之间使用循环引用。 员工属于部门,部门必须有经理(部门负责人)。 我是否必须禁用约束才能进行插入? 问题答案: 问: 是否必须禁用约束才能进行插入? 答: 在Oracle中,否,如果外键约束为否,则为否 (请参见下面的示例) 对于Oracle: 让我们解压一下: (必须禁用自动提交) 推迟执行外键约束 在“部门”表中插入一行,并为F

  • 我有三个实体,EntityA、EntityB和EntityC,以这样的方式 是否有任何方法或任何库来生成正确的响应bean? 注意:使用lazy不是一个选项,因为在其他一些方法中,我希望获得相关的实体。

  • 问题内容: 我使用的 春天3,JPA + Hibernate的 一个应用。在该应用程序中,我有一个服务类方法,该方法用具有属性的Annotation进行注释。在该方法内部,我正在使用循环将数据(即实体类)插入表中。对于每个循环实体类,必须将其保存到数据库。但这没有发生。仅当循环执行完成并从方法退出时,才会执行提交。然后,它提交并立即保存所有内容。但是在这种情况下,在提交数据之前,我需要先读取数据。

  • 问题内容: 我定义了两个类,以便它们都包含对另一个对象的引用。它们看起来与此类似(这是简化的;在我的实际域模型中,类A包含一个B列表,每个B都有对父A的引用): 在与已通过使用Eclipse中A和B这两个问题的两个场产生的是调用或在任一对象方法的结果在因为它们都调用另一个对象的和方法。例如,以下程序将无法使用上述对象: 如果用这种方式用循环关系定义域模型存在内在的错误,请告诉我。据我所知,虽然这是