如何将我之前在 sql 中创建的列更改为外键

Posted

技术标签:

【中文标题】如何将我之前在 sql 中创建的列更改为外键【英文标题】:How do I change a column I created a while ago in sql to foreign key 【发布时间】:2017-08-08 22:15:23 【问题描述】:

我需要将多个表更改为外键。我已经使用了命令

ALTER TABLE financial_transactions
ADD FOREIGN KEY (item_rental_id) REFERENCES transaction_id(item_rental_id);

表名是financial_transactions,列名是item_rental_id。它给了我一个错误说:

外键“FK__financial__item___46E78A0C”引用无效表“transaction_id”。

我该如何解决这个问题?

【问题讨论】:

外键的目标必须是主键。 transaction_id 是主键。有语法错误吗?谢谢 引用无效表'transaction_id'意味着没有transaction_id表 您必须映射 item_rental_id 将从中引用的表 阅读这篇关于外键概念的文章technet.microsoft.com/en-us/library/…。对于此示例,SalesOrderHeader 将是您的金融交易表,而 SalesPerson 将是外键引用的表。 【参考方案1】:

是的,这是创建外键的正确脚本

ALTER TABLE financial_transactions
  ADD FOREIGN KEY (item_rental_id) REFERENCES customer_rentals(item_rental_id);

但是,如果您尝试在已包含数据的表上添加外键约束,则必须确保 Financial_transactions 表中的 item_rental_id 也在 customer_rentals 表中。否则,您将遇到参照完整性错误。

举例说明:

CREATE TABLE customer_rentals_1
(item_rental_id INT,
 PRIMARY KEY (item_rental_id)
);

CREATE TABLE financial_transactions_1
(transaction_id INT,
 item_rental_id INT,
 PRIMARY KEY (transaction_id)
);

ALTER TABLE financial_transactions_1
  ADD FOREIGN KEY (item_rental_id) REFERENCES customer_rentals_1(item_rental_id);

以上脚本将成功运行。

CREATE TABLE customer_rentals_2
(item_rental_id INT,
 PRIMARY KEY (item_rental_id)
);

CREATE TABLE financial_transactions_2
(transaction_id INT,
 item_rental_id INT,
 PRIMARY KEY (transaction_id)
);

INSERT INTO financial_transactions_2
VALUES (1000, 9999);

ALTER TABLE financial_transactions_2
  ADD FOREIGN KEY (item_rental_id) REFERENCES customer_rentals_2(item_rental_id);

但是,由于 item_rental_id 9999 不在 customer_rentals_2 表中,因此会出现以下错误

Msg 547, Level 16, State 0, Line 31
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK__financial__item___76969D2E". The conflict occurred in database "TESTDB", table "dbo.customer_rentals_2", column 'item_rental_id'.

【讨论】:

【参考方案2】:

你必须给出第二个表名 两种方式都可以 1.添加无名引用

 ALTER TABLE financial_transactions
    ADD FOREIGN KEY (item_rental_id) REFERENCES customer_rentals(item_rental_id);

2.添加名称引用

ALTER TABLE financial_transactions
   ADD CONSTRAINT FK_Financial_Transactions_Customer_Rental_Item_Rental_ID
   FOREIGN KEY (item_rental_id) REFERENCES Customer_rentals(item_rental_id); 

【讨论】:

您从哪里获得 item_rental 表?您只是根据命名约定进行假设吗? 这就是我根据列名 item_rental_id 猜测的第二个表名 Item_rental 因为没有item_rental所以不行。包含该列的表是financial_transactions,主键列是transaction_id。我需要将外键添加到 item_rental_id 列 ALTER TABLE financial_transactions 添加外键 (item_rental_id) REFERENCES customer_rentals(item_rental_id);现在我收到一个新错误,他的 ALTER TABLE 语句与 FOREIGN KEY 约束“FK__financial__item___4BAC3F29”冲突。冲突发生在数据库“tvk5250”、表“dbo.customer_rentals”、列“item_rental_id” 费迪南德,我们现在在同一条路上,但为什么我仍然投反对票?

以上是关于如何将我之前在 sql 中创建的列更改为外键的主要内容,如果未能解决你的问题,请参考以下文章

当主键列是mysql中不同表的外键时,如何将主键列更改为自动递增

sql中创建组合主键和组合外键

数据库开发基础-SQl Server 主键外键子查询(嵌套查询)

在MySQL中如何设置主键和外键

主键外键

sql新建数据库表,及主键外键