Error: FOREIGN KEY relationship could not be added! #1452 - Cannot add or update a child row: a foreign key constraint fails

Error: FOREIGN KEY relationship could not be added! #1452 - Cannot add or update a child row: a foreign key constraint fails

我在尝试创建这两个 table 之间的关系时遇到了这个问题: 沃齐拉和 帐号

完整错误:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`shscodin_cars`.`#sql-123257_12d31ca`, CONSTRAINT `#sql-123257_12d31ca_ibfk_1` FOREIGN KEY (`id`) REFERENCES `vozila` (`vlasnik_id`))

我知道人们已经提出过类似的错误,但是通过查看他们的 tables 和答案,我无法弄清楚它如何适合我的情况,那就是为什么我要开始提问。

-我想达到什么目的?

因为我想创建一个 Web 应用程序,用它来显示有关车辆的信息(来自汽车 table),但当然我只想显示分配给特定用户的车辆,不是全部。

什么时候出现这个错误?

当我尝试在 table 之间(vozila 和帐户)建立关系时出现错误。

这是用于创建这两个 table 的代码:

CREATE TABLE `accounts` (
  `id` int(11) NOT NULL,
  `username` varchar(50) NOT NULL,
  `password` varchar(255) NOT NULL,
  `email` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

对于 vozila

CREATE TABLE `vozila` (
  `id` int(11) NOT NULL,
  `make` varchar(50) COLLATE utf8_bin NOT NULL,
  `model` varchar(50) COLLATE utf8_bin NOT NULL,
  `godina` int(50) NOT NULL,
  `boja` varchar(50) COLLATE utf8_bin NOT NULL,
  `vin` varchar(50) COLLATE utf8_bin NOT NULL,
  `engine` varchar(50) COLLATE utf8_bin NOT NULL,
  `tip` varchar(50) COLLATE utf8_bin NOT NULL,
  `vlasnik` varchar(50) COLLATE utf8_bin NOT NULL,
  `regoz` varchar(50) COLLATE utf8_bin NOT NULL,
  `istek` date NOT NULL,
  `odometer` varchar(50) COLLATE utf8_bin NOT NULL,
  `napomena` varchar(50) COLLATE utf8_bin NOT NULL,
  `vlasnik_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

--
-- Indexes for table `accounts`
--
ALTER TABLE `accounts`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `vozila`
--
ALTER TABLE `vozila`
  ADD PRIMARY KEY (`id`),
  ADD KEY `vlasnik_id` (`vlasnik_id`);

如您所见,vlasnik_id 用作 INDEX,我正在尝试在 vlasnik_id(作为参考)和 id 之间创建关系作为 FOREIGN KEY。

有人能告诉我我在 table 的创作方面做出了正确的决定吗?我是否为网络应用程序或其他目的添加了正确的密钥?

如果你创建了这个外键:

ALTER TABLE accounts ADD FOREIGN KEY (id) REFERENCES vozila (vlasnik_id);

根据您的设置,创建该约束确实成功。

但是有两个问题

第一个问题:每个账号只能拥有一辆车。每个帐户仅存储在一行中,其 id 具有单个值。如果 id 必须引用 vozila 中的一行,那么它只能引用一辆车。我觉得应该允许一个账号拥有多辆汽车的可能性更大

第二个问题:必须先插入具有引用值的行,然后才能插入引用它的行。换句话说,您必须先插入到 vozila,所有者的值在 vlasnik_id,然后才能将行插入到 accountsid。这似乎倒退了。

如果你这样定义外键,两个问题都解决了:

ALTER TABLE vozila ADD FOREIGN KEY (vlasnik_id) REFERENCES account(id);

您首先创建一个帐户,然后插入一辆或多辆引用该车主 id 的汽车。一个账号可以拥有多辆汽车。