Sql server 主键/外键

Sql server 主键/外键,sql-server,Sql Server,目前我已经规范化了几个表,但我有一些问题。为了简单起见: 我有两张桌子。 1:用户访问 2:用户信息 在UserAccess中,“id”是主键,在userInformation中“id”是外键。如何确保在两个表中插入内容时,id将保持不变。所以当我插入一些东西时,它们会自动相等。所以我可以用join语句轻松地查询它 编辑另一个问题 当您最终删除一些记录时,例如id 1。如何确保id为1的所有记录都将被删除?如果你删除了它,那么id顺序看起来会很奇怪,不是吗 例如,您有: 这是代码,只是为了完整

目前我已经规范化了几个表,但我有一些问题。为了简单起见:

我有两张桌子。 1:用户访问 2:用户信息

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

编辑另一个问题

当您最终删除一些记录时,例如id 1。如何确保id为1的所有记录都将被删除?如果你删除了它,那么id顺序看起来会很奇怪,不是吗

例如,您有:

这是代码,只是为了完整

设置:

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;

外键约束将强制执行所需的引用完整性。级联删除将允许用户删除父级并自动删除任何引用的子类。如果没有级联删除,如果父级引用任何子级,则删除父级的任何尝试都会失败。ent表,让mysql为其生成一个ID(例如自动增量),使用

last\u insert\u ID()检索该ID
,然后使用该ID插入子表。很抱歉,我使用了错误的标签。这是一个mssql服务器。我仍然可以使用它吗?您需要在userAccess中声明ID为对userInformation具有引用完整性的外键。这将确保在userAccess中只允许插入有效的userInformation ID。您可以大多数(如果不是所有的话)RDBMS都有这个功能。Ms sql server有一个GUI来帮助您实现这一点。
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;