【问题标题】:How to Link Foreign Key with Different Name如何链接具有不同名称的外键
【发布时间】:2016-05-20 02:20:41
【问题描述】:

我有 2 个不同的表:Profile 和 Transaction

个人资料包括:pID、名字、姓氏、电话号码

交易包括:transID、sellerID、buyerID、itemID

我的问题是:

如何确保 sellerIDbuyerID 都作为外键引用 Profile 表中的 profileID?

我现在的代码:

CREATE TABLE PROFILE
( 
pID INT NOT NULL AUTO_INCREMENT , 
firstName VARCHAR(20) NOT NULL , 
lastName INT(20) NOT NULL , 
phoneNumb INT NOT NULL , 
PRIMARY KEY (pID)
)   ENGINE = InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE TRANSACTION 
( 
tID INT NOT NULL AUTO_INCREMENT , 
sellerID INT ,
buyerID INT,
itemID INT, 
PRIMARY KEY (tID),
FOREIGN KEY (sellerID, buyerID) REFERENCES PROFILE(pID),
FOREIGN KEY (itemID) REFERENCES ITEM (itemID)
)   ENGINE = InnoDB DEFAULT CHARSET=latin1;

我试过这个,它给了我这种错误

1239 - 'foreign key without name' 的外键定义不正确:键引用和表引用不匹配

谢谢。

【问题讨论】:

  • 为什么你的lastName字段是INT

标签: mysql sql


【解决方案1】:

我会这样做:

CREATE TABLE TRANSACTION 
( 
    tID INT NOT NULL AUTO_INCREMENT, 
    sellerID INT,
    buyerID INT,
    itemID INT, 
    PRIMARY KEY (tID),
    CONSTRAINT fk1 FOREIGN KEY (sellerID) REFERENCES PROFILE(pID)
    CONSTRAINT fk2 FOREIGN KEY (buyerID) REFERENCES PROFILE(pID)
    CONSTRAINT itemKey FOREIGN KEY (itemID) REFERENCES ITEM (itemID)
) ENGINE = InnoDB DEFAULT CHARSET=latin1;

这假设存在一个名为ITEM 的表,它有一个名为itemID 的主键。你原来的问题只提到了两个表。如果ITEM 不存在,则创建它或从TRANSACTION 中删除外键约束。

【讨论】:

  • 我先试试这个,然后告诉你。
  • 感谢您的回复。
  • 嗨蒂姆,它现在可以工作了。谢谢你。但是,我也想知道到底发生了什么。是否因为我添加了 CONSTRAINT fk1 和 fk2 这个词而起作用?
  • 您需要一次添加一个单独的外键。
  • @MasAdam,除了 Tim 的回答,我可以创建一个新表 TRANSACTION_ITEM,这将是与 TRANSACTIONITEM 的多对多关系。使用当前表,您每次交易只能出售一件商品,但拥有另一张表将允许每次交易多件商品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多