phpmyadmin 错误:不能添加FOREIGN KEY关系!#1452 -不能添加或更新子行:外键约束失败

wlp8pajw  于 2022-11-09  发布在  PHP
关注(0)|答案(1)|浏览(228)

我在尝试创建这两个表之间的关系时遇到了此问题:vozila和帐户
完整错误:


# 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`))

我知道有些人已经问过这个问题了,但是通过看他们的表格和答案,我不知道这个问题如何适合我的情况,这就是为什么我提出这个问题。

  • 我想达到什么目的?
    因为我想创建一个Web应用程序,用它来显示有关车辆的信息(来自汽车表),但当然我只想显示分配给特定用户的车辆,而不是所有车辆。
    何时发生此错误?
    当我尝试在表(vozila和帐户)之间创建关系时,出现了我遇到的错误。
    下面是用于创建这两个表的代码:
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;

而对于沃齐拉

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(作为外键)之间创建关系。
有人能告诉我是否做出了与表创建相关的正确决定,以及我是否为Web应用程序或其他目的添加了正确的键吗?

sycxhyv7

sycxhyv71#

如果您创建了此外键:

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

根据您的设置,创建该约束确实会成功。
但有两个问题。
第一个问题:每个帐户只能是一辆汽车的所有者。每个帐户只存储在一行中,并且它的id只有一个值。如果该id必须引用vozila中的一行,则它只能引用一辆汽车。我认为更有可能的情况是,一个帐户应该被允许是多辆汽车的所有者。
第二个问题:必须先插入具有被引用值的行,然后才能插入引用该行的行。换句话说,必须先插入vozila,其中所有者的值在vlasnik_id中,然后才能将行插入accounts,其中包含id。这似乎是倒退。
如果按以下方式定义外键,则两个问题都可以解决:

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

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

相关问题