【问题标题】:Auto populating FKs自动填充 FK
【发布时间】:2018-12-30 11:23:52
【问题描述】:

好的,所以我正在尝试设置一个新的小型数据库。在白板上全部列出之后,我开始在 SQL Server 中创建它。我已经使用相关的 PK 和 FK 创建了所有表。但是,当我将数据插入这些表时,我希望我的 PK 和 FK 自动填充我认为我在创建表期间设置的。例如,假设我有 3 列,一列是 PK,另一列是 FK。当我在此表中插入一条新记录时,我只想为非 PK/FK 的第三列名称指定信息,并让 PK 自动递增,并允许 FK 为空。

我使用的 CREATE 语句是:

CREATE TABLE CONSOLE
(
     consoleID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
     consoleName VARCHAR(25) NOT NULL,
     userID int FOREIGN KEY REFERENCES USER(userID)
);

所以当我去添加一条我想使用的记录时:

INSERT INTO CONSOLE
VALUES ('Xbox');

【问题讨论】:

  • 如果要允许空值,外键约束的意义何在?
  • 当您插入Xbox 时,数据库应该如何神奇地知道您指的是哪个用户?当然,您必须为外键提供一个值。
  • @P.Salmon 我想他想用 NULL 值填充,他稍后会更新它。
  • I would like my PKs and FKs to auto populate which I thought I had setup during table creation 你能告诉我们你是怎么做到的吗?
  • @P.Salmon "如果您要允许空值,外键约束的意义何在?" 需要这种情况来实现与 0 或 1 的关系记录。例如,您可以通过从一个人到其配偶的可空 FK 来代表一夫一妻制。但是,我完全支持在这种情况下 userID 可以为空不太可能是有意的,这可能是您想说的。

标签: sql sql-server create-table insert-into


【解决方案1】:

我希望您稍后会通过更新表格来填充 FK 值。因为,RDBMS 不会自动为您填充 FK 值。

使用 FK 的默认值为 NULL 创建表,如下所示。

CREATE TABLE CONSOLE(
    consoleID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    consoleName VARCHAR(25) NOT NULL,
    userID int FOREIGN KEY REFERENCES USER(userID) DEFAULT NULL 
);

当您插入表时,指定列名。现在,PK 将自动增加值,FK 将为 NULL。

INSERT INTO CONSOLE(ConsoleName)
VALUES ('Xbox');

编辑

我从 cmets 看到您想要自动填充 PK 和 FK。无法自动填充 FK。您可以通过两种方式做到这一点:

  1. 编写一个 AFTER INSERT 触发器,它将找到正确的 FK 值并 INSERT 到表中。
  2. 编写带有参数的存储过程以进行插入。获取 ConsoleName 的值并找到正确的 FK 值并插入到下表中,如下所示。

DECLARE @rightUserId INT; -- Find value for this INSERT INTO CONSOLE(ConsoleName, UserId) VALUES ('Xbox',@rightUserId);

【讨论】:

  • 好吧,这是有道理的。我想我的主要问题是,那么做外键的最佳方法是什么?我是一名入门级开发人员,并且已经完成了很多使用 ERD 构建数据库的图表,但是当您实际构建它时,链接外键的最佳方法是什么?我想我很困惑,因为我总是被教导一个 FK 是另一个表的 PK,所以如果它不能作为另一个表的 PK 为空,它怎么可能是一个空 FK? FK都是手动输入的吗?
  • @J33NO,是的。外键作为插入语句的一部分手动输入或从父表中找到,然后作为语句的一部分插入到子表中(即席或存储过程或触发器的一部分)
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 2012-04-02
  • 1970-01-01
  • 2016-02-20
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多