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 - 如何插入外键作为列的值的主要内容,如果未能解决你的问题,请参考以下文章