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

在SQL中输入数据时处理循环引用

徐友樵
2023-03-14
问题内容

您使用哪种SQL技巧将数据输入到两个表之间,并在两个表之间使用循环引用。

Employees
    EmployeeID <PK>
    DepartmentID <FK> NOT NULL

Departments
    DepartmentID <PK>
    EmployeeID <FK> NOT NULL

员工属于部门,部门必须有经理(部门负责人)。

我是否必须禁用约束才能进行插入?


问题答案:

问: 是否必须禁用约束才能进行插入?
答: 在Oracle中,否,如果外键约束为否,则为否DEFERRABLE (请参见下面的示例)

对于Oracle:

    SET约束所有延迟;
    插入部门的值('foo','dummy');
    INSERT INTO员工值('bar','foo');
    UPDATE Departments SET EmployeeID ='bar'WHERE DepartmentID ='foo';
    犯罪;

让我们解压一下:

  • (必须禁用自动提交)
  • 推迟执行外键约束
  • 在“部门”表中插入一行,并为FK列添加一个“虚拟”值
  • 在FY引用Department的行中插入Employee表
  • 用实际参考替换部门FK中的“虚拟”值
  • 重新启用约束条件

注意:禁用外键约束对所有会话都有效,DEFERRING约束在事务级别(如示例中)或在会话级别(ALTER SESSION SET CONSTRAINTS=DEFERRED;

Oracle至少十年以来一直允许将外键约束定义为DEFERRABLE。我将所有外键约束(当然)定义为立即可延迟。这样可以保持每个人都期望的默认行为,但是允许在不禁用外键的情况下进行操作。

参见AskTom:
http
:
//www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html

参见AskTom:http
://asktom.oracle.com/pls/asktom/f
?
p=100:11:0::::P11_QUESTION_ID:10954765239682

另请参见:http
:
//www.idevelopment.info/data/Oracle/DBA_tips/Database_Administration/DBA_12.shtml

[编辑]

答: 在Microsoft SQL
Server中,您不能像在Oracle中那样推迟外键约束。禁用和重新启用外键约束是一种方法,但是我对以下情况感到震惊:1)对性能的影响(当重新启用该约束时正在检查ENTIRE表的外键约束),2)如果(何时?)约束的重新启用失败。请注意,禁用约束将影响所有会话,因此,在禁用约束时,其他会话可能会插入和更新行,这将导致重新启用约束失败。

使用SQL Server,更好的方法是删除NOT NULL约束,并在插入/更新行时允许使用NULL作为临时占位符。

对于SQL Server:

    -(已从Departments.EmployeeID移除NOT NULL约束)
    插入部门值('foo',NULL)
    去
    插入员工值(“ bar”,“ foo”)
    去
    更新Departments设置EmployeeID ='bar',其中DepartmentID ='foo'
    去

[/编辑]



 类似资料:
  • 有一个名为Avro-Tools的工具,它随Avro一起提供,可以用来在JSON、Avro-Schema(.avsc)和二进制格式之间进行转换。但它不能用于循环引用。 我们有两个文件: > 循环.avsc(由Avro生成) json(由jackson生成,因为它有循环引用,Avro不喜欢这样)。 通告.AVSC circular.json 在上面运行avro-tools的命令 Java-jar av

  • 下面是我的父组件,它包含一个循环的多个输入。如何选择一个来聚焦?在这种情况下,我必须创建动态吗?

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

  • 问题内容: 我有2张表: 在部门中: numEmpl是主键 numDept是对Departamentos(numDept)的外键引用。在部门中: numDept是主键 numDirect是对Empleados(numEmpl)的外键引用 因此,有一个循环参考。 首先,我创建了表格: 现在,我在它们之间创建引用: 它起作用了,所以现在我尝试插入一些数据: 但是现在它引发了一个错误,告诉我不能在循环引

  • 问题内容: 在我的代码中,用户可以上传一个excel文档,希望其中包含电话联系人列表。作为开发人员,我应阅读excel文件,将其转换为dataTable并将其插入数据库。问题是某些客户拥有大量的联系人,例如说5000个和更多的联系人,而当我尝试将这种数据量插入数据库时​​,它崩溃了,并给了我一个超时异常。避免这种异常的最佳方法是什么?它们的任何代码都可以减少insert语句的时间,从而使用户不必等

  • 我一直在寻找如何弄清楚如何让一个输入或某些东西进入一个time循环。就像在,输入()命令不会停止我的秒表。我尝试过tkinter、pygame和其他几种方法,但它们都不起作用。如果有人能帮我,我更喜欢小而简单的东西,如果这是可能的话。具体来说,我想学习做什么,基本上是允许在按下任何键时立即停止(最好不按回车键)。谢谢,马鞍猪! 以下是我到目前为止的情况,没有任何东西可以激活停止: