主/外键

时间:2015-05-11 17:12:41

标签: sql-server

目前我已将几张表格标准化,但我有一些问题。为了简单起见:

我有2张桌子。 1:userAcces 2:userInformation

在userAcces" id"是userInformation" id"中的主键。是外键。如何确保当我在两个表中插入内容时,id将保持不变。所以当我插入一些东西时,它们会自动相互对等。所以我可以使用join语句轻松查询它。

编辑另一个问题。

当您最终删除某些记录时,例如ID 1.如何确保删除所有id为1的记录?如果您已将其删除,那么ID顺序看起来会很奇怪吗?

例如你" le有:

id  name
3   james
6   Elona
9   Bryan

1 个答案:

答案 0 :(得分:0)

Here is an explanation using SQLFiddle

这是代码,只是为了完整......

设定:

CREATE TABLE ParentTable (
  ID int NOT NULL PRIMARY KEY,
  Name varchar(50)
)

CREATE TABLE ChildTable (
  ID int NOT NULL PRIMARY KEY,
  ParentID int NOT NULL FOREIGN KEY REFERENCES ParentTable(ID) ON DELETE CASCADE,
  Description varchar(50)
)

INSERT ParentTable VALUES ( 1, 'Bob');
INSERT ParentTable VALUES ( 2, 'Tim');

INSERT ChildTable VALUES ( 1, 1, 'Bob''s Description');
INSERT ChildTable VALUES ( 2, 2, 'Tim''s Description');

示例:

SELECT * FROM ParentTable PT INNER JOIN ChildTable CT on CT.ParentID = PT.ID;

-- This will fail
INSERT ChildTable VALUES (3, 3, 'Judy''s Description');

-- It will succeed after inserting the Parent Record
INSERT ParentTable VALUES ( 3, 'Judy');
INSERT ChildTable VALUES (3, 3, 'Judy''s Description');
SELECT * FROM ParentTable PT INNER JOIN ChildTable CT on CT.ParentID = PT.ID;

-- Deleting the parent record will "cascade" the delete to the child table
DELETE ParentTable WHERE ID = 1;
SELECT * FROM ParentTable PT INNER JOIN ChildTable CT on CT.ParentID = PT.ID;

外键约束将强制执行您所需的引用完整性。级联删除将允许用户删除父级,并将自动删除任何引用子级。如果没有级联删除,任何删除父级的尝试都将失败,如果父级被任何子级引用。