如何使表的属性成为该表中的外键?

时间:2013-04-03 23:27:28

标签: sql database foreign-keys

我必须编写SQL来创建表,属性和主要&此ERD中的外键: http://imgur.com/VYZbwr6

在ERD表'Financial_Transactions'中,有一个名为'previous_transaction_id'的属性和另一个名为'transaction_id'的属性。在此表中,'previous_transaction_id'除了作为属性外,还是该表的外键。它引用了表中的最后一个'transaction_id'。

以下是'financial_transactions'表的SQL:

CREATE TABLE financial_transactions(
transaction_id int IDENTITY(1,1) NOT NULL,
account_id int NOT NULL,
item_rental_id int NOT NULL,
previous_transaction_id int,
transaction_type_code int NOT NULL,
transaction_date date NOT NULL,
transaction_amount money NOT NULL,
transaction_comment varchar(512) NOT NULL);

ALTER TABLE financial_transactions ADD CONSTRAINT pk_financial_transactions PRIMARY KEY (transaction_id);

ALTER TABLE financial_transactions ADD  CONSTRAINT fk_financial_transactions_accounts FOREIGN KEY(account_id)
REFERENCES accounts (account_id);

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

ALTER TABLE financial_transactions ADD  CONSTRAINT fk_financial_transactions_financial_transactions FOREIGN KEY(previous_transaction_id)
REFERENCES financial_transactions (previous_transaction_id);

ALTER TABLE financial_transactions ADD  CONSTRAINT fk_financial_transactions_transaction_types FOREIGN KEY(transaction_type_code)
REFERENCES transaction_types (transaction_type_code);

当我运行我的SQL(包括脚本中每个表的语句)时,我得到以下错误:

“Ms 1776,Level 16,State 0,Line 87 引用的表'financial_transactions'中没有主键或候选键与外键'fk_financial_transactions_financial_transactions'中的引用列列表匹配。

Msg 1750,Level 16,State 0,Line 87 无法创建约束。查看以前的错误。“

所有其他语句正常执行。

我做错了什么?

*我最初在CREATE TABLE下使用了这个语句:previous_transaction_id int NOT NULL, 但是,它导致了同样的错误,在搜索时我看到了一个类似的问题,通过删除NOT NULL来修复。

2 个答案:

答案 0 :(得分:1)

下面

ALTER TABLE financial_transactions ADD  CONSTRAINT 
fk_financial_transactions_financial_transactions 
FOREIGN KEY(previous_transaction_id)
REFERENCES financial_transactions (previous_transaction_id);

您有一个列引用自身。那是你的意图还是你想引用transaction_id?

答案 1 :(得分:0)

为同一个表定义一个外键没有任何问题,但是你有一个引用自身的列。

尝试更换:

ALTER TABLE financial_transactions ADD  CONSTRAINT fk_financial_transactions_financial_transactions FOREIGN KEY(previous_transaction_id)
REFERENCES financial_transactions (previous_transaction_id);

使用:

ALTER TABLE financial_transactions ADD  CONSTRAINT fk_financial_transactions_financial_transactions FOREIGN KEY(previous_transaction_id)
REFERENCES financial_transactions (transaction_id);