【问题标题】:Can't I assign a foreign key to a table that isn't a primary to another table?我不能将外键分配给不是另一个表的主表的表吗?
【发布时间】:2019-12-04 12:44:20
【问题描述】:

错误代码:1822。添加外键约束失败。引用表 'resident' 中缺少约束 'officials_ibfk_1' 的索引

我创建了一个超类表,其中包含两个相互关联的子类表。为什么会出现这个错误?我不能将外键分配给不是另一个表的主表吗?

CREATE TABLE User (
    `userid` int NOT NULL AUTO_INCREMENT,
    `username` varchar(30) NOT NULL UNIQUE,
    `password` varchar(30) NOT NULL,
    `emailaddress` varchar(50) NOT NULL UNIQUE,
    `lastname` varchar(20),
    `firstname` varchar(20),
    `birthday` date,
    `sex` varchar(7) CHECK (sex IN ('Male', 'Female')),
    `address` varchar(100),
    `billingproof` varchar(100),
     PRIMARY KEY (userid)
);

CREATE TABLE Resident (
    `residentid` int NOT NULL,
    `userid` int,
    `groupid` int,
    `accntstatus` VARCHAR(13) CHECK (accntstatus IN ('Approved', 'For Approval', 'Disapproved')),
    `residenttype` VARCHAR(40) CHECK (residenttype IN ('Individual Resource', 'Service Provider', 'Individual Resource and Service Provider')),
    `householdid` INT,
    `elected` boolean,
     FOREIGN KEY (userid) REFERENCES User(userid)
);  

CREATE TABLE Officials (
    `electedid` int NOT NULL,
    `userid` int,
    `position` varchar(15) CHECK (position IN ('Staff', 'Village Officer')),
    `isSystemAdmin` boolean,
    `startDate` date,
    `endDate` date,
    `residentid` int,
    FOREIGN KEY (residentid) REFERENCES Resident(residentid),
    FOREIGN KEY (userid) REFERENCES User(userid)
);

【问题讨论】:

  • 由于您的问题是针对 mysql 的,您是否还可以添加标签 mysql?这将有助于未来的访问者。

标签: mysql sql database-schema


【解决方案1】:

在 MySQL 中,引用的键不一定是主键,但必须通过索引保证它是唯一的(参见MySQL documentation on foreign key constraints):

MySQL 需要在外键和引用键上建立索引,以便外键检查可以快速且不需要表扫描。

这在您收到的错误消息中也明确指出:

添加外键约束失败。 缺少索引,约束“officials_ibfk_1”在引用的表“resident”中

所以要解决它,改变:

`residentid` int NOT NULL,

到:

`residentid` int NOT NULL UNIQUE,

【讨论】:

  • 我已在我的表中的所有外键中添加了 'NOT NULL' 和 UNIQUE 关键字,但它仍然不起作用。
  • 使用 MySQL 5.7 可以正常工作here。你的 MySQL 是什么版本的?
【解决方案2】:

FOREIGN KEY 是用于将两个表链接在一起的键。

外键是一个表中的一个字段(或字段集合),它引用另一个表中的主键source

CREATE TABLE Resident (
`residentid` int NOT NULL,
`userid` int,
`groupid` int,
`accntstatus` VARCHAR(13) CHECK (accntstatus IN ('Approved', 'For Approval', 'Disapproved')),
`residenttype` VARCHAR(40) CHECK (residenttype IN ('Individual Resource', 'Service Provider', 'Individual Resource and Service Provider')),
`householdid` INT,
`elected` boolean,
 PRIMARY KEY (residentid),
 FOREIGN KEY (userid) REFERENCES User(userid));  
  • 您需要将 residentid 设为主键,这样您就可以从 Officials 的外键>居民

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 2017-05-03
    • 2021-11-20
    • 2015-12-08
    • 1970-01-01
    • 2019-07-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多