【问题标题】:how to reference multiple fks from different tables in MySQL如何从 MySQL 中的不同表中引用多个 fks
【发布时间】:2017-01-05 20:39:57
【问题描述】:

我一直在环顾四周,我找不到在 sql 中执行此操作的正确方法,我目前的编码方式只是导致我的第三个表失败,但其余代码在第三个表之前运行良好,我只是需要第三个表来包含前两个表中的 fks

第一个表

SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS Customer;
CREATE TABLE Customer
(
CustomerNumber int NOT NULL,
CustomerName varchar(255),
CustomerAddress varchar(255),
CustomerPhoneNumber varchar(255),
JoinDate varchar(255),
PetName varchar(255),
PayScheme varchar(255),
PremiumPayDate varchar(255),
PRIMARY KEY (CustomerNumber, PetName)
);

第二张桌子

DROP TABLE IF EXISTS Policies;    
CREATE TABLE Policies
(
PolicyID int NOT NULL,
PolicyNumber int NOT NULL,
PetType varchar(255),
CustomerNumber int NOT NULL, 
PetName varchar(255),
EffectiveDate varchar(255),
PRIMARY KEY (PolicyID),
    CONSTRAINT fk_CustomerNumber_PetName
    FOREIGN KEY (CustomerNumber, PetName)
    REFERENCES Customer(CustomerNumber, PetName)
);

第三张桌子

DROP TABLE IF EXISTS Claims;    
CREATE TABLE Claims
(
ClaimsID int NOT NULL,
AmountForReimbursement varchar(255),
PolicyID int NOT NULL,
PetName varchar(255),
    PRIMARY KEY (ClaimsID),
    CONSTRAINT fk_PolicyID_PetName
    FOREIGN KEY (PolicyID, PetName)
    REFERENCES Policies(PolicyID), Customer(PetName)        
);

【问题讨论】:

  • 我不认为这是问题所在?我检查过,但我是 SQL 新手
  • 正确的what方法? FK 表示某些列的值必须出现在其他地方,因为某些列的值是 UNIQUE NOT NULL(包括 PK)。您希望 Claims policy-petname 对也出现在 Policies 中,并且 Policies customer-petname 对出现在 Customer 中。 PS 为什么 petname 在索赔中只是相关政策中的宠物名?

标签: mysql foreign-keys relational-database primary-key


【解决方案1】:

您应该考虑阅读 MySQL 文档。您再次为 Claims 创建表错误。应该是这样的

CREATE TABLE Claims
(
ClaimsID int NOT NULL,
AmountForReimbursement varchar(255),
PolicyID int NOT NULL,
PetName varchar(255),
CustomerNumber int NOT NULL,
    PRIMARY KEY (ClaimsID),
    CONSTRAINT fk_PolicyID_PetName
    FOREIGN KEY (PolicyID) REFERENCES Policies(PolicyID), 
    FOREIGN KEY (CustomerNumber, PetName) REFERENCES Customer(CustomerNumber, PetName)        
);

始终建议您同时参考 PK 列,因为您定义了复合 PK

【讨论】:

  • 它在 MySQL 中不起作用。外键只能引用键的 最左 列。在 OP 的表中,PetName 不在最左边。
  • hmmmm 这不起作用仍然收到与它说它无法创建表相同的错误?但是我认为现在的创作是正确的
  • @lukegriffiths,如果有帮助,请参阅答案中的编辑。感谢比尔指出错误
  • 感谢@Rahul 似乎正在工作,所以如果它的复合只是指整个 pk
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多