SQL - 如何插入外键作为列的值

Posted

技术标签:

【中文标题】SQL - 如何插入外键作为列的值【英文标题】:SQL - How to INSERT a foreign key as a value for a column 【发布时间】:2011-11-05 09:23:12 【问题描述】:

我知道这是相当基本的,我已经搜索了很长一段时间的答案,但我很困扰。

我不知道如何使我的代码在此处可读,但在这里。

这是用于制作相关表格的查询:

CREATE TABLE customer   
(   customer_id INT NOT NULL CONSTRAINT customer_pk PRIMARY KEY IDENTITY,
    first_name  VARCHAR(20) NOT NULL,       
    surname VARCHAR(20) NOT NULL,       
    dob DATETIME    NOT NULL,       
    home_address    VARCHAR(50) NOT NULL,       
    contact_number  VARCHAR(10) NOT NULL,       
    referrer_id INT NULL    FOREIGN KEY REFERENCES customer(customer_id),   
);

这是问题代码:

--fill customer table
INSERT INTO customer
VALUES ( 'Harold', 'Kumar', '2010-07-07 14:03:54', '3 Blue Ln, Perth', 0812391245, NULL )
INSERT INTO customer 
VALUES ( 'Bingo', 'Washisnameoh', '2010-09-21 12:30:07', '3 Red St, Perth', 0858239471, NULL )
INSERT INTO customer
VALUES ( 'John', 'Green', '2010-11-07 14:13:34', '4 Blue St, Perth', 0423904823, NULL )
INSERT INTO customer
VALUES ( 'Amir', 'Blumenfeld', '2010-11-01 11:03:04', '166 Yellow Rd, Perth', 0432058323, NULL)

INSERT INTO customer
VALUES ( 'Hank', 'Green', '2010-07-07 16:04:24', '444 Orange Crs, Perth', 0898412429, 8)

(特别是末尾有 8 值的那一行。)

当执行第二个查询时,它会这样响应:

消息 547,第 16 级,状态 0,第 1 行 INSERT 语句冲突 具有 FOREIGN KEY SAME TABLE 约束 “FK_客户_referr__5772F790”。数据库发生冲突 “master”,表“dbo.customer”,列“customer_id”。该声明 已终止。

感谢您对此的帮助。

【问题讨论】:

这是 sql server 吗?你有一个名为 master 的数据库? 您是否不小心将表运行到 master 中? @marc_s 谢谢我下次再做。 @Icarus 这是我正在使用的 sql server management studio。我很确定默认有一个主数据库或其他东西,我不完全了解它。 @Mitch 我怎么知道我有没有? 【参考方案1】:

1) 您在 customer_id 上有一个主键 - 您的插入语句对客户 id 没有价值

2) 您有一个以referrer_id 形式引用customer_id 的自引用外键。 当您插入一条 referrer_id 不为空的记录时,在您的情况下为“8”,请确保您已经插入了一条 customer_id 为“8”的记录

【讨论】:

【参考方案2】:

你怎么知道referrer_id应该是8??

您需要做的是捕获插入的customer_id 的值,然后在第二个查询中使用它:

DECLARE @referToID INT

INSERT INTO dbo.Customer(first_name, surname, dob, home_address, contact_number, referrer_id)
VALUES ('Harold', 'Kumar', '2010-07-07 14:03:54', '3 Blue Ln, Perth', 0812391245, NULL)

SELECT @ReferToID = SCOPE_IDENTITY() ;  -- catch the newly given IDENTITY ID

INSERT INTO dbo.Customer(first_name, surname, dob, home_address, contact_number, referrer_id)
VALUES ('Hank', 'Green', '2010-07-07 16:04:24', '444 Orange Crs, Perth', 0898412429, @ReferToID)

我不知道您要引用哪一行(您没有指定)-但我希望您了解其中的机制:

将新行插入表中 使用SCOPE_IDENTITY获取新插入的ID 插入引用第一行的下一行并使用SCOPE_IDENTITY返回的值

更新:如果你真的想拥有一个给定的行引用本身(奇怪的概念.....),那么你需要分两步完成:

将新行插入表中 使用SCOPE_IDENTITY获取新插入的ID 更新该行以设置referrer_id

类似这样的:

DECLARE @NewCustomerID INT

INSERT INTO dbo.Customer(first_name, surname, dob, home_address, contact_number)
VALUES ('Hank', 'Green', '2010-07-07 16:04:24', '444 Orange Crs, Perth', 0898412429)

SELECT @NewCustomerID = SCOPE_IDENTITY() ;  -- catch the newly given IDENTITY ID

UPDATE dbo.Customer
SET referrer_id = @NewCustomerID
WHERE customer_id = @NewCustomerID

【讨论】:

哦,外键是为了让它成为一个自引用实体,不好意思应该提了。 @Owen:是的,当然——但是该行不能真正引用自己,对吧? “汉克”行引用了客户表中的其他行,不是吗?? 是的,它不能只引用其他行。这是在客户推荐另一个新客户的情况下。 @Owen:正如我试图在回答中解释的那样:您需要做的是将新插入的customer_id 捕获到 SQL 变量中,然后使用该特定值(可以是任何值)在您的下一个 INSERT(或 UPDATE)语句中。你不能依赖于你的 ID 的固定值——那些 IDENTITY 值是由 SQL Server 给出的【参考方案3】:

您在这里遇到的唯一问题是身份必须有一个种子值,可以像 Identity(1,1) 一样,其中第一个 1 是起点,发送 1 是自动种子号...重新运行你的插入语句

【讨论】:

以上是关于SQL - 如何插入外键作为列的值的主要内容,如果未能解决你的问题,请参考以下文章

主键约束,外键约束,空值约束,默认值约束,唯一约束,检查约束的各个作用是啥?

如何在 sql server 中设置外键列的默认值?

外键SQL语句的编写

SQL中啥叫主键,啥是外键,有啥关系

mysql中添加外键问题,求高手

SQL - 唯一键,主键和外键