引用自身的外键列的作用(或目的)是什么?

在数据库迁移过程中,我运行了一个表单的数据库表约束:

ALTER TABLE [dbo].[myTable]
ADD CONSTRAINT [someName] FOREIGN KEY ([id]) REFERENCES [dbo].[myTable] ([id])
ON DELETE NO ACTION
ON UPDATE NO ACTION

为什么会这样做? 这最初是在Sybase数据库上完成的,我们正在转换为SQL Server 2008 R2。

更新 :是的,外键约束是引用同一个表和相同字段的字段。

我在源Sybase数据库上运行了这个查询,并找到了42个定义的疯狂键,所以它看起来不像是一个错字。

SELECT sr.constrid as [Constraint ID],
       so.name as [Table],
       sc.name as [Column]
  FROM sysreferences sr
       INNER JOIN sysobjects so ON (so.id = sr.tableid)
       INNER JOIN syscolumns sc ON (sc.id = sr.tableid AND sc.colid = sr.fokey1)
 WHERE sr.tableid = sr.reftabid
   AND sr.fokey1 = sr.refkey1
   AND sr.fokey2 = 0
   AND sr.refkey2 = 0

我相信层次结构是您在书中使用外键的标准示例,例如:

create table Employees (
 EmployeeID int identity primary key,
 EmployeeName varchar(50),
 ManagerID int
 Foreign key (managerID) references Employees(EmployeeID)
)

您发布的内容在同一个表中看起来像是这种层次关系的错误应用。 我不完全确定你为什么想这样做。

希望这有助于=)


惊喜! 这完全有效:

create table crazy (
    ID int primary key references crazy (ID) -- This runs
);
insert into crazy select 1;  -- So does this
select * from crazy; -- Returns 1
truncate table crazy; -- Works just fine

我只能认为这会是一个错误(Typo?在图中将一列拖到自身上?)或用于欺骗另一个系统(ORM?)进入某种特定行为。 我会很好奇,看看有人提出了一个合法的理由。

更新:由@ 8kb提供的巧妙建议,这可能是为了防止截断,但我们可以从我的例子看到即使截断也能正常工作。


我想这是数据库模型中的一个错误。

这真的很奇怪。 我无法想象这种结构有什么用处。

如何插入数据的唯一方法是不检查参考完整性。 这意味着显式禁用引用或某种类型的批量插入等等。

链接地址: http://www.djcxy.com/p/11291.html

上一篇: What is the effect (or purpose) of a foreign key column referencing itself?

下一篇: Problems compiling pshtoolkit